以实现下图效果为例:
private void Form1_Load(object sender, EventArgs e)
{
BindPort();
BindBaudRate();
BindStopBits();
BindDateBits();
BindParity();
SettingDDefault();
}
#region 绑定参数
//端口
private void BindPort()
{
string[] arr = SerialPort.GetPortNames();//拿到计算机中所有可用端口
if (arr.Length == 0)
{
MessageBox.Show("没有搜索到可用串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
cbbPort.DataSource = arr;
}
//波特率
private void BindBaudRate()
{
List<int> list = new List<int>()
{
1382400,
921600,
460800,
256000,
230400,
128000,
115200,
76800,
57600,
43000,
38400,
19200,
14400,
9600,
4800,
2400,
1200
};
cbbBaudRate.DataSource = list;
}
//停止位
private void BindStopBits()
{
List<StopBit> list = new List<StopBit>()
{
new StopBit(){Text="0",Value="None"},
new StopBit(){Text="1",Value="One"},
new StopBit(){Text="1.5",Value="OnePointFive"},
new StopBit(){Text="2",Value="Two"}
};
cbbStopBits.DataSource = list;
cbbStopBits.DisplayMember = "Text";
cbbStopBits.ValueMember = "Value";
}
//数据位
private void BindDateBits()
{
List<int> list = new List<int>()
{
8,
7,
6,
5
};
cbbDateBits.DataSource = list;
}
//校验位
private void BindParity()
{
List<ParityModel> list = new List<ParityModel>()
{
new ParityModel(){Text="无校验",Value="None"},
new ParityModel(){Text="奇校验",Value="Odd"},
new ParityModel(){Text="偶校验",Value="Even"},
new ParityModel(){Text="标记校验",Value="Mark"},
new ParityModel(){Text="空白校验",Value="Space"}
};
cbbParity.DataSource = list;
cbbParity.DisplayMember = "Text";
cbbParity.ValueMember = "Value";
}
#endregion
private void SettingDDefault()
{
cbbBaudRate.Text = ConfigurationManager.AppSettings["BaudRate"];
cbbStopBits.SelectedValue = ConfigurationManager.AppSettings["StopBits"];
cbbDateBits.Text = ConfigurationManager.AppSettings["DateBits"];
cbbParity.SelectedValue = ConfigurationManager.AppSettings["Parity"];
}
//打开串口
private void btnSerialPort_Click(object sender, EventArgs e)
{
try
{
if (!serialPort1.IsOpen) //设置默认值
{
serialPort1.PortName = cbbPort.Text;//设置端口
serialPort1.BaudRate = Convert.ToInt32(cbbBaudRate.Text);//设置波特率
serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cbbStopBits.SelectedValue.ToString());//设置停止位
serialPort1.DataBits = Convert.ToInt32(cbbDateBits.Text);//设置数据位
serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cbbParity.SelectedValue.ToString());//设置校验位
serialPort1.Open();//打开串口
btnSerialPort.Text = "关闭窗口";
MessageBox.Show("打开成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
serialPort1.Close();
btnSerialPort.Text = "打开串口";
MessageBox.Show("关闭成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
MessageBox.Show("请打开串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(rtbSend.Text))
{
MessageBox.Show("请输入文本", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//换行
if (cbNewRow.Checked)
{
//把字符串转成byte[] ,处理中文乱码
byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text + "\r\n");
serialPort1.Write(buffer, 0, buffer.Length);
}
else
{
byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
serialPort1.Write(buffer, 0, buffer.Length);
}
}
//接收数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
// 这里放置需要在 UI 线程执行的代码
Invoke(new Action(() =>
{
if (cbHexShow.Checked)
{
rtbDisplayInfo.Text += HexByteConvert.ByteToHexString(buffer);
}
else
{
//把字节数组转成字符串
rtbDisplayInfo.Text += Encoding.UTF8.GetString(buffer, 0, buffer.Length);
}
}));
}
//白底黑字
private void cbWhite_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = (CheckBox)sender;
if (checkBox.Checked)
{
rtbDisplayInfo.BackColor = Color.White;
rtbDisplayInfo.ForeColor = Color.Black;
}
else
{
rtbDisplayInfo.BackColor = Color.Black;
rtbDisplayInfo.ForeColor = Color.FromArgb(0, 192, 0);
}
}
//定时发送
private void cbTimeSend_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = (CheckBox)sender;
if (checkBox.Checked)
{
if (!serialPort1.IsOpen)
{
MessageBox.Show("请打开串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
checkBox.Checked = false;
return;
}
if (string.IsNullOrWhiteSpace(tbTimeInterval.Text))
{
MessageBox.Show("请输入周期", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
checkBox.Checked = false;
return;
}
timer1.Interval = Convert.ToInt32(tbTimeInterval.Text);
timer1.Enabled = true;
tbTimeInterval.Enabled = false;
}
else
{
timer1.Enabled = false;
tbTimeInterval.Enabled = true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(rtbSend.Text)) return;
//换行
if (cbNewRow.Checked)
{
byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text + "\r\n");
serialPort1.Write(buffer, 0, buffer.Length);
}
else
{
byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
serialPort1.Write(buffer, 0, buffer.Length);
}
}
//以16进制发送
private void cbHexSend_CheckedChanged(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(rtbSend.Text))
{
CheckBox cb = (CheckBox)sender;
if (cb.Checked)
{
byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
string str = HexByteConvert.ByteToHexString(buffer);
rtbSend.Text = str.Trim();
}
else
{
byte[] buffer = HexByteConvert.HexStringToByte(rtbSend.Text);
string str = Encoding.UTF8.GetString(buffer);
rtbSend.Text = str;
}
}
}
//以16进制显示
private void cbHexShow_CheckedChanged(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(rtbDisplayInfo.Text)) return;
CheckBox checkBox = (CheckBox)sender;
if (checkBox.Checked)
{
byte[] bbuffer = Encoding.UTF8.GetBytes(rtbDisplayInfo.Text.Trim());
string str = HexByteConvert.ByteToHexString(bbuffer);
rtbDisplayInfo.Text = str;
}
else
{
byte[] buffer = HexByteConvert.HexStringToByte(rtbDisplayInfo.Text.Trim());
string str = Encoding.UTF8.GetString(buffer);
rtbDisplayInfo.Text = str;
}
}
// 判断输入是否是16进制格式的字符串,但也可以包含空格
private bool IsHex(string input)
{
Regex hexadecimal = new Regex("^[A-Fa-f0-9\\s]+$");
return hexadecimal.IsMatch(input);
}
//限制以16进制发送时,rtbSend 输入框的输入
private void rtbSend_TextChanged(object sender, EventArgs e)
{
RichTextBox richTextBox = (RichTextBox)sender;
if (richTextBox != null && !string.IsNullOrWhiteSpace(richTextBox.Text) && cbHexSend.Checked)
{
bool result = IsHex(richTextBox.Text);
if (!result)
{
MessageBox.Show("请输入正确格式0-9 a-f A-F,例如:01 0d 0a");
richTextBox.Text = "";
}
}
}
//清除接收
private void btnClear_Click(object sender, EventArgs e)
{
rtbDisplayInfo.Text = "";
}
其中引用的类:
public class StopBit
{
public string Text { get; set; }
public string Value { get; set; }
}
public class ParityModel
{
public string Text { get; set; }
public string Value { get; set; }
}
public class HexByteConvert
{
/// <summary>
/// 把字节数组转换成16进制的字符串,以空格分割,如:68 65 6C 6C 6F
/// </summary>
/// <param name="data">字节数组</param>
/// <returns>16进制的字符串</returns>
public static string ByteToHexString(byte[] data)
{
string result = string.Empty;
for (int i = 0; i < data.Length; i++)
{
result += data[i].ToString("X2") + " ";
}
return result;
}
/// <summary>
/// 把16进制的字符串转换成字节数组
/// </summary>
/// <param name="hexString">16进制的字符串,以空格分割</param>
/// <returns>字节数组</returns>
public static byte[] HexStringToByte(string hexString, int fromBase = 16)
{
string[] strs = hexString.Split(' ');
byte[] result = new byte[strs.Length];
for (int i = 0; i < strs.Length; i++)
{
result[i] = Convert.ToByte(strs[i], fromBase);
}
return result;
}
}
标签:string,C#,Text,void,private,buffer,助手,串口,new
From: https://blog.csdn.net/hcyily/article/details/142501452