物聯網架構成長之路(37)-基於C#開發串口工具

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

 

 

參考文章:
  http://www.javashuo.com/article/p-apvzkgar-mb.htmlspa

本文地址: http://www.javashuo.com/article/p-gdsayhlq-em.html調試

相關文章
相關標籤/搜索