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

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


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

  打开后,创建虚拟串口

 

==== 2021-02-24 11:14:14 更新 ======

由于使用破解版始终不太好,这里提供一个免费的版本 com0com

https://files.cnblogs.com/files/wunaozai/com0com-3.0.0.0-i386-and-x64-signed.zip


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

posted @ 2019-10-13 10:54  无脑仔的小明  阅读(2186)  评论(0编辑  收藏  举报