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