zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    用友软件T3出纳通提示单据锁定
    保存单据时提示“计量单位组不正确”
    cxgrid导出数据的格式设置(转载)
    会话打印机不会自动删除解决方法
    用友U8总账对账不平问题总结
    存货核算期初无法从库存取数
    SQL Server 2000 数据库日志太大!如何管理,清除,变小,压缩它
    Delphi控件cxGrid 如何动态创建列?
    关于Treeview 选中节点高亮有关问题
    U8远程接入客户端重新安装问题
  • 原文地址:https://www.cnblogs.com/braceli/p/5800699.html
Copyright © 2011-2022 走看看