0. 前言
做爲物聯網平臺開發,最基礎的工具鏈仍是要有的。前幾篇博客,介紹了用C#開發一個MQTT的客戶端,用於模擬設備鏈接平臺,併發送數據到平臺。可是對於一些硬件來講,可能會用到串口uart來發送數據。而後通過模塊,轉換爲JSON再經過MQTT發往平臺。這個適合須要開發一些工具來協助開發。平臺當然重要,可是對應的工具鏈也是比較重要的。html
1. 建立虛擬串口
要作一個串口工具,爲了方便調試,咱們須要安裝一個虛擬串口軟件。模擬兩個串口,而後用標準的串口工具來發送數據,本身開發的工具用來接收數據。
http://www.greenxf.com/soft/213933.html 能夠在這裏下載破解版。
先安裝第二個原版。而後用第一個打開。
編程
打開後,建立虛擬串口
併發
2. C#串口編程
效果圖(本工具,不開源,不給代碼):
工具
3. 參考代碼ui
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