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