美文网首页玩Play
C#串口通信:2自动连接

C#串口通信:2自动连接

作者: RUYES | 来源:发表于2017-07-02 12:06 被阅读364次

上次说到了协议的大致结构,这次我们来说说怎么去实现制动连接串口(当你把设备连上来之后,怎么去让软件自动去识别是否为目标设备,当然这需要上位机与下位机共同完成,这里我们只讨论上位机部分)

先上协议:

帧头(3)+设备号(1)+指令类型(2)+数据长度(2)+载荷+CRC(2)

需要在下位机上实现的部分:

接收到一帧数据(帧头为53 5A 59,设备号01,类型为02,载荷无)53 59 A2 01 02 00 00 00 CRC后,会返回(帧头为53 5A 59,设备号01,类型为02,载荷为"6F 6B")53 5A 59 01 02 00 02 00 6F 6B CRC则表示指令接收成功。

下面说我的思路,在软件界面打开后,开一个自动连接线程处理连接部分。具体步骤是:

  1. 获取计算机所有串口。
  2. 尝试发送指定数据到每个可用串口。
  3. 尝试从串口接收数据并检查是否为约定数据,若是则绑定该端口,完成连接。不是则换到下一个。循环。

好了,让我们简单点,下面直接上代码:

bool IsConnected=false;
private void AutoConcted()
      {
          while (true)//循环
          {
              while (!IsConnected)//未连接
              {
                  string[] strPorNnames = SerialPort.GetPortNames();//获取所有可用串口名
                  foreach (string portName in strPorNnames)//遍历串口
                  {
                      try
                      {
                          SPort.PortName = portName;
                          SPort.Open();
                          SPort.DiscardOutBuffer();
                          byte[] bytSend = new byte[] {0x53,0x59,0xA2,0x01,0x02, 0x00,0x00,0x00,CRC};//自行去CRC去
                          SPort.Write(bytSend, 0, bytSend.Length);
                          Thread.Sleep(100);//确保数据发送及解析时间
                          int n = SPort.BytesToRead;
                          byte[] bytRec = new byte[n];
                          SPort.Read(bytRec, 0, n);
                          if (IsHertJump(bytRec))//判断返回是否为指定数据
                          {
                              IsConnected = true;  
                              break;//是则跳出循环
                          }
                          else
                          { SPort.Close(); }
                      }
                      catch (Exception)
                      { SPort.Close(); }
                  }
                  Thread.Sleep(400);
              }
          }
      }

是的,自动连接应该可以实现了,然而又有了新问题,这种自动连接貌似只能连一次,中途拔掉一下就不行了,因为连接上之后进程就自己销毁了。而且拔掉之后(串口断开)软件并不会有任何的状态提示,之后你所有的数据都会往一个不知道的地方去了。所以,我们还要加一个检测断开的机制。由于两者不会同时需要,所以可以写到一个线程里去,没连上就自动去连,连上了就检测是否断开。

修改后的代码:(完善后的自动连接线程)

private void AutoConcted()
      {
          while (true)
          {
              while (!IsConnected)
              {
                  string[] strPorNnames = SerialPort.GetPortNames();
                  foreach (string portName in strPorNnames)
                  {
                      try
                      {
                          SPort.PortName = portName;
                          SPort.Open();
                          SPort.DiscardOutBuffer();
                          byte[] bytSend = new byte[] {0x53,0x59,0xA2,0x01,0x02, 0x00,0x00,0x00,CRC};//自行去CRC去
                          SPort.Write(bytSend, 0, bytSend.Length);
                          Thread.Sleep(100);
                          int n = SPort.BytesToRead;
                          byte[] bytRec = new byte[n];
                          SPort.Read(bytRec, 0, n);
                          if (IsHertJump(bytRec))
                          {
                              IsConnected = true;
                              break;
                          }
                          else
                          {
                              SPort.Close();
                          }
                      }
                      catch (Exception)
                      {
                          SPort.Close();
                      }
                  }
                  Thread.Sleep(400);
              }
              while (IsConnected)
              {
                  if (!SPort.IsOpen)//检查是否断开
                  {
                      SPort.Close();
                      IsConnected = false;
                  }
                  Thread.Sleep(1000);
              }

          }
      }

相关文章

  • C#串口通信:2自动连接

    上次说到了协议的大致结构,这次我们来说说怎么去实现制动连接串口(当你把设备连上来之后,怎么去让软件自动去识别是否为...

  • arduino——串口控制开关灯(笔记)

    串口简介 Arduino与计算机通信的最常用方式就是串口通信,当使用USB线将二者连接时,便建立了串口连接,通过串...

  • php 连接串口,串口通信

    今天需要本地测试一下打开串口,用php实现,其实用什么语言实现都不是问题,主要是本地串口没配置好,耽误了好几个小时...

  • Android串口通信工具

    Android串口通信简单封装,可以用于和连接串口的硬件通信或者进行硬件调试 集成方法: Step 1. Add ...

  • 串口编程

    串口连接界面 主要控件 打开串口 自动获取串口列表并显示 初始化串口 写入卡片 插入打卡记录并显示打卡成功

  • JS获取电子秤读数

    JS直接获取串口数据比较麻烦另做一个程序维护js和串口的通信 基本原理:使用websocket语言:C# 组成部分...

  • Serial串口通信

    1、SerialClass 2、连接串口 3、底层串口数据接收

  • Android USB转串口通信

    一、引用 1、Git上最火的USB转串口通信2、Android之USB转串口通信3、安卓开发中的USB转串口通讯 ...

  • C#串口通信:3协议解析

    C#串口通信:协议解析 发送部分就是字节数组拼接,在此不多说了,主要说说上位机接收并解析协议部分。 主要上串口在接...

  • 9.21

    串口通信: 1. 串行通信 2.全双工、半双工 3.同步与异步 4.通信的速率 结合所讲的内容写串口程序,根据硬件...

网友评论

    本文标题:C#串口通信:2自动连接

    本文链接:https://www.haomeiwen.com/subject/jnpncxtx.html