• 物联网架构成长之路(37)-基于C#开发串口工具


    0. 前言
      作为物联网平台开发,最基础的工具链还是要有的。前几篇博客,介绍了用C#开发一个MQTT的客户端,用于模拟设备连接平台,并发送数据到平台。但是对于一些硬件来说,可能会用到串口uart来发送数据。然后经过模块,转换为JSON再通过MQTT发往平台。这个适合需要开发一些工具来协助开发。平台固然重要,但是对应的工具链也是比较重要的。


    1. 创建虚拟串口
      要做一个串口工具,为了方便调试,我们需要安装一个虚拟串口软件。模拟两个串口,然后用标准的串口工具来发送数据,自己开发的工具用来接收数据。
      http://www.greenxf.com/soft/213933.html 可以在这里下载破解版。
      先安装第二个原版。然后用第一个打开。

      打开后,创建虚拟串口


    2. C#串口编程
      效果图(本工具,不开源,不给代码):

    3. 参考代码

      1        #region 模块串口功能
      2 
      3         private void btnSerialModulRefresh_Click(object sender, EventArgs e)
      4         {
      5             string[] names = SerialPort.GetPortNames();
      6             if(names == null || names.Length <= 0)
      7             {
      8                 MessageBox.Show("未找到串口COM 可以在这里下载虚拟串口工具: http://www.greenxf.com/soft/213933.html");
      9                 return;
     10             }
     11             cbbSerialModulCOM.Items.Clear();
     12             cbbSerialModulCOM.Items.AddRange(names);
     13             cbbSerialModulCOM.SelectedItem = names[0];
     14         }
     15 
     16         private void btnSerialModulOpen_Click(object sender, EventArgs e)
     17         {
     18             try
     19             {
     20                 if (serialModulPort.IsOpen)
     21                 {
     22                     //串口处于打开状态
     23                     serialModulPort.Close();
     24                     btnSerialModulOpen.Text = "●打开串口";
     25                     btnSerialModulOpen.ForeColor = Color.Red;
     26                     txtSerialModulRecv.Text = "";
     27 
     28                     cbbSerialModulCOM.Enabled = true;
     29                     cbbSerialModulDataBits.Enabled = true;
     30                     cbbSerialModulParity.Enabled = true;
     31                     cbbSerialModulRate.Enabled = true;
     32                     cbbSerialModulStopBits.Enabled = true;
     33                 }
     34                 else
     35                 {
     36                     if (string.IsNullOrEmpty(cbbSerialModulCOM.Text))
     37                     {
     38                         MessageBox.Show("串口COM不能为空");
     39                         return;
     40                     }
     41 
     42                     //串口处于关闭状态,需要设置好属性后打开
     43                     cbbSerialModulCOM.Enabled = false;
     44                     cbbSerialModulDataBits.Enabled = false;
     45                     cbbSerialModulParity.Enabled = false;
     46                     cbbSerialModulRate.Enabled = false;
     47                     cbbSerialModulStopBits.Enabled = false;
     48 
     49                     serialModulPort.PortName = cbbSerialModulCOM.Text;
     50                     serialModulPort.BaudRate = Convert.ToInt32(cbbSerialModulRate.Text);
     51                     serialModulPort.DataBits = Convert.ToInt16(cbbSerialModulDataBits.Text);
     52 
     53                     string parity = cbbSerialModulParity.Text;
     54                     if (parity.Equals("None"))
     55                     {
     56                         serialModulPort.Parity = Parity.None;
     57                     }else if (parity.Equals("Odd"))
     58                     {
     59                         serialModulPort.Parity = Parity.Odd;
     60                     }else if (parity.Equals("Even"))
     61                     {
     62                         serialModulPort.Parity = Parity.Even;
     63                     }else if (parity.Equals("Mark"))
     64                     {
     65                         serialModulPort.Parity = Parity.Mark;
     66                     }else if (parity.Equals("Space"))
     67                     {
     68                         serialModulPort.Parity = Parity.Space;
     69                     }
     70 
     71                     string stopbit = cbbSerialModulStopBits.Text;
     72                     if (stopbit.Equals("1"))
     73                     {
     74                         serialModulPort.StopBits = StopBits.One;
     75                     }else if (stopbit.Equals("1.5"))
     76                     {
     77                         serialModulPort.StopBits = StopBits.OnePointFive;
     78                     }else if (stopbit.Equals("2"))
     79                     {
     80                         serialModulPort.StopBits = StopBits.Two;
     81                     }
     82 
     83                     serialModulPort.Open();
     84                     btnSerialModulOpen.Text = "●关闭串口";
     85                     btnSerialModulOpen.ForeColor = Color.Blue;
     86                 }
     87             }catch(Exception ex)
     88             {
     89                 serialModulPort = new SerialPort();
     90                 btnSerialModulOpen.Text = "●打开串口";
     91                 btnSerialModulOpen.ForeColor = Color.Red;
     92                 txtSerialModulRecv.Text = "";
     93 
     94                 cbbSerialModulCOM.Enabled = true;
     95                 cbbSerialModulDataBits.Enabled = true;
     96                 cbbSerialModulParity.Enabled = true;
     97                 cbbSerialModulRate.Enabled = true;
     98                 cbbSerialModulStopBits.Enabled = true;
     99                 //出现可能的错误
    100                 MessageBox.Show(ex.Message);
    101             }
    102         }
    103 
    104         private void btnSerialModulPortSend_Click(object sender, EventArgs e)
    105         {
    106             try
    107             {
    108                 if (serialModulPort.IsOpen)
    109                 {
    110                     string data = txtSerialModulSend.Text.Replace(" ", "");
    111                     if (string.IsNullOrEmpty(data))
    112                     {
    113                         MessageBox.Show("请先在发送区填写发送数据(十六进制)");
    114                         return;
    115                     }
    116                     byte[] bytes = HexStrTobyte(data);
    117                     serialModulPort.Write(bytes, 0, bytes.Length);
    118                 }
    119                 else
    120                 {
    121                     MessageBox.Show("请先打开串口COM");
    122                 }
    123             }catch(Exception ex)
    124             {
    125                 serialModulPort = new SerialPort();
    126                 btnSerialModulOpen.Text = "●打开串口";
    127                 btnSerialModulOpen.ForeColor = Color.Red;
    128                 txtSerialModulRecv.Text = "";
    129 
    130                 cbbSerialModulCOM.Enabled = true;
    131                 cbbSerialModulDataBits.Enabled = true;
    132                 cbbSerialModulParity.Enabled = true;
    133                 cbbSerialModulRate.Enabled = true;
    134                 cbbSerialModulStopBits.Enabled = true;
    135                 //出现可能的错误
    136                 MessageBox.Show(ex.Message);
    137             }
    138         }
    139 
    140         private void serialModulPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    141         {
    142             Console.WriteLine("收到数据");
    143             try
    144             {
    145                 //因为要访问UI资源,所以需要使用invoke方式同步ui
    146                 Invoke((EventHandler)(delegate{
    147                     txtSerialModulRecv.Text = "";
    148                     int size = serialModulPort.BytesToRead;
    149                     string buf = "";
    150                     for(int i=0; i<size; i++)
    151                     {
    152                         byte c = (byte)serialModulPort.ReadByte();
    153                         buf += ByteToHexString(c) + " ";
    154                     }
    155                     txtSerialModulRecv.Text = buf;
    156                 }));
    157             }
    158             catch (Exception ex)
    159             {
    160                 //响铃并显示异常给用户
    161                 System.Media.SystemSounds.Beep.Play();
    162                 MessageBox.Show(ex.Message);
    163             }
    164         }
    165 
    166         private void btnSerialModulPortClearRecv_Click(object sender, EventArgs e)
    167         {
    168             txtSerialModulRecv.Text = "";
    169         }
    170         #endregion

    参考文章:
      https://www.cnblogs.com/liaocheng/p/9144317.html

    本文地址: https://www.cnblogs.com/wunaozai/p/11665404.html

  • 相关阅读:
    面试题 16:反转链表
    Makefile学习之路6————通过函数增强功能
    Makefile学习之路5————变量
    Makefile学习之路3————规则的运行
    LED灯C语言的点亮方式
    LED灯汇编机器码的点亮方式
    Linux的进阶命令
    入门命令2
    shell命令解析器功能说明及入门命令1
    C++基础 — C++中的变量和三目运算符
  • 原文地址:https://www.cnblogs.com/wunaozai/p/11665404.html
Copyright © 2020-2023  润新知