发布:2021/12/24 17:49:08作者:管理员 来源:本站 浏览次数:1616
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
© Copyright 2014 - 2025 柏港建站平台 ejk5.com. 渝ICP备16000791号-4