Loading... 心血来潮,想用c#写个简单的串口调试工具,于是有了此文。 因为功能很简单,就不进行说明了。 ## 一、界面设计 包含串口参数配置,串口打开和关闭,串口发送和接收数据显示,常用指令保存,其界面如下图所示。  底部的第2-8个发送框可保存上一次输入内容,方便调试。 ## 二、界面初始化 ```c# private SerialPort _serialPort = new SerialPort(); //波特率 cmbPort.Items.Add("1200"); cmbPort.Items.Add("2400"); cmbPort.Items.Add("4800"); cmbPort.Items.Add("9600"); cmbPort.Items.Add("19200"); cmbPort.Items.Add("38400"); cmbPort.Items.Add("56000"); cmbPort.Items.Add("57600"); cmbPort.Items.Add("64000"); cmbPort.Items.Add("115200"); cmbPort.Items.Add("230400"); //校验位 cmbVerify.Items.Add("N(无校验)"); cmbVerify.Items.Add("O(奇校验)"); cmbVerify.Items.Add("E(偶校验)"); cmbVerify.Text = "E(偶校验)"; cmbStopBit.Items.Add("0"); cmbStopBit.Items.Add("1"); cmbStopBit.Items.Add("2"); cmbStopBit.Text = "1"; //数据位 cmbDataBit.Items.Add("6"); cmbDataBit.Items.Add("7"); cmbDataBit.Items.Add("8"); cmbDataBit.Text = "8"; //串口数据到达事件处理函数 _serialPort.DataReceived += _serialPort_DataReceived; ``` ## 三、数据格式转换类 ```c# public static class ConvertHelper { public static byte[] GetByteArray(string shex) { string[] ssArray = shex.Split(' '); List<byte> bytList = new List<byte>(); foreach (var s in ssArray) { //将十六进制的字符串转换成数值 bytList.Add(Convert.ToByte(s, 16)); } //返回字节数组 return bytList.ToArray(); } public static string Hex2String(byte[]b) { StringBuilder sb = new StringBuilder(); for(int i = 0;i<b.Length; i++) { sb.Append(string.Format("{0:x2}", b[i])); if(i< b.Length - 1) { sb.Append(' '); } } return sb.ToString(); } } ``` ## 四、数据接收、发送及显示 ```c# private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] buff = new byte[_serialPort.ReadBufferSize]; int len = _serialPort.Read(buff, 0, _serialPort.ReadBufferSize); if (len > 0) { PrintBuffer(buff, true); } } catch (Exception ex) { MessageBox.Show(ex.Message, "提示"); } throw new NotImplementedException(); } private void cmbPort_DropDown(object sender, EventArgs e) { string temp = cmbPort.Text; cmbPort.Items.Clear(); string[] ports = SerialPort.GetPortNames(); Array.Sort(ports); cmbPort.Items.AddRange(ports); if (temp == string.Empty) cmbPort.SelectedIndex = cmbPort.Items.Count > 0 ? 0 : -1; else cmbPort.Text = temp; } private void SendBuffer(string str) { var buf = ConvertHelper.GetByteArray(str); _serialPort.Write(buf, 0, buf.Length); PrintBuffer(buf,false); } private void button2_Click(object sender, EventArgs e) { try{ var text = textBox2.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch(Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button3_Click(object sender, EventArgs e) { try { var text = textBox3.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button4_Click(object sender, EventArgs e) { try { var text = textBox4.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button5_Click(object sender, EventArgs e) { try { var text = textBox5.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button6_Click(object sender, EventArgs e) { try { var text = textBox6.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button7_Click(object sender, EventArgs e) { try { var text = textBox7.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button8_Click(object sender, EventArgs e) { try { var text = textBox8.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button9_Click(object sender, EventArgs e) { try { var text = textBox9.Text.Trim(); if (text.Length <= 0) return; SendBuffer(text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "提示"); } } private void button1_Click(object sender, EventArgs e) { if(button1.Text=="打开") { try { //配置参数合法性检验 if(cmbPort.SelectedIndex==-1 || cmbDataBit.SelectedIndex==-1 || cmbStopBit.SelectedIndex==-1 || cmbVerify.SelectedIndex==-1) { MessageBox.Show("请选择合适的参数后,再试!", "提示"); return; } //设置属性 _serialPort.BaudRate = int.Parse(cmbPort.Text); _serialPort.DataBits = int.Parse(cmbDataBit.Text); _serialPort.StopBits = (StopBits)int.Parse(cmbStopBit.Text); _serialPort.Parity = (Parity)cmbVerify.SelectedIndex; //打开串口 _serialPort.Open(); CtlControl(false); } catch(Exception ex) { MessageBox.Show(ex.Message, "提示"); CtlControl(true); } } else { //关闭串口 _serialPort.Close(); CtlControl(true); } } private void CtlControl(bool isVisible) { cmbPort.Enabled=isVisible; cmbDataBit.Enabled=isVisible; cmbStopBit.Enabled=isVisible; cmbVerify.Enabled=isVisible; if(isVisible) { button1.Text = "关闭"; } else { button1.Text = "打开"; } } private void PrintBuffer(Byte[] buffer,bool isRecv) { var log = string.Format("[{0}] [{1}]:{2}", DateTime.Now.ToString("G"), isRecv ? "接收" : "发送", ConvertHelper.Hex2String(buffer)); if(textBox1.InvokeRequired) { Invoke(new MethodInvoker(() => textBox1.AppendText(log))); } else { textBox1.AppendText(log); } } ``` 最后修改:2022 年 02 月 03 日 10 : 41 PM © 允许规范转载