C# 串口通信使用简结

1:获取所有串口名称并排序

string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);

2:设置串口通信参数并打开串口

// 创建串口实例
 private SerialPort comm = new SerialPort();

// 设置端口名称、波特率、校验位、停止位等参数
 comm.PortName = cmbPortName.Text;
 comm.BaudRate = int.Parse(cmbRate.Text);

// 打开串口
 try
    {
        comm.Open();   
     }
 catch (Exception ex)
     {
     //捕获到异常信息,创建一个新的comm对象,之前的不能用了。   
         comm = new SerialPort();
    //将异常信息传递给用户。   
         MessageBox.Show(ex.Message);
      }            

3:串口接收数据

 private long received_count = 0;//接收计数   
List<string> receiveString = new List<string>();
void
comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增加接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16进制 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 //this.txtHistoryText.AppendText(builder.ToString()); receiveString.Add(builder.ToString()); // txtHistoryText.ScrollToCaret(); //修改接收计数 labelGetCount.Text =received_count.ToString(); comm_DataSend(receiveString[receiveString.Count-1]); })); }

4:串口发送数据

 private long send_count = 0;//发送计数

//
要发送的消息 void comm_DataSend(string receiveMessage) { //定义一个变量,记录发送了几个字节 int n = 0; //16进制发送 if (checkBoxHexSend.Checked) { //我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数 MatchCollection mc = Regex.Matches(GetSendMessage(receiveMessage), @"(?i)[da-f]{2}"); List<byte> buf = new List<byte>();//填充到这个临时列表中 //依次添加到列表中 foreach (Match m in mc) { //buf.Add(byte.Parse(m.Value)); buf.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber)); } //转换列表为数组后发送 comm.Write(buf.ToArray(), 0, buf.Count); //记录发送的字节数 n = buf.Count; } else//ascii编码直接发送 { //包含换行符 if (checkBoxNewlineSend.Checked) { comm.WriteLine(GetSendMessage(receiveMessage)); n = GetSendMessage(receiveMessage).Length + 2; } else//不包含换行符 { comm.Write(GetSendMessage(receiveMessage)); n = GetSendMessage(receiveMessage).Length; } } send_count += n;//累加发送字节数 labelSendCount.Text =send_count.ToString();//更新界面 }

5:关闭串口

 comm.Close();
原文地址:https://www.cnblogs.com/braceli/p/5800699.html