隐藏

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

发布:2021/12/24 17:49:08作者:管理员 来源:本站 浏览次数:735



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