C#串口通信随笔
1. 自动获取本机串口号
调用SerialPort.GetPortNames()方法
string[] portNames = SerialPort.GetPortNames();//获取所有可用串口的名字 //如果获取到串口名称,将名称加到comboBox Items内 if (portNames != 0) { for(int i=0; i < portNames.Length; i++) { comboBox1.Items.Add(portNames[i]).ToString(); } } //如果获取不到串口名称,就将comboBox Item显示为COM1~COM20 else { for(int i=0; i < portNames.Length; i++) { comboBox1.Items.Add(portNames[i]).ToString(); } } comboBox1.SelectIndex = 0;//设置串口显示的串口名为Items内第一个
2. 串口連接其他設置羅列出選項
1) 波特率: 1200bps/2400bps/4800bps/9600bps/19200bps...
2) 數據位: 5/6/7/8
3) 校驗位: None/Odd/Even
4) 停止位: 0/1/1.5/2
通過comboBox.Items.Add()方法羅列出來
3. 串口連接
1) 聲明一個串口類
SerialPort sp = new SerialPort();
2) 打開sp這個串行端口連接
sp.Open( );
3) 發送指令
sp.Write(要發送的字節數組, 從零開始的字節偏移量, 要寫入的字節數);
4) 接收串口回复數據
a. 定義DataReceived事件,當串口收到數據後觸發此事件,放在load函數內
sp.DataReceived += new SerialDataReceivedEventHandler(處理接收數據的方法/函數);
b. 處理接收數據的方法/函數 詳解
try { List<byte> buffer = new List<byte>(4096);//新建一個byte的List int n = sp.BytesToRead;//定義一個n來獲取接收緩衝區中數據的字節數 byte[] ReceiveBytes = new byte[1024 * 1024];//中轉完整接收字節數組 byte[] buf = new byte[n];//新建一個字節數組,長度為n,中轉不確定是否完整的接收數組 sp.Read(buf, 0, n);//從sp輸入緩衝區讀取n個字節並將這些字節寫入字節數組中指定的偏移量0處。 buffer.AddRange(buf);//將buf字節數組裡的元素添加到buffer list內 //完整性判斷 while (buffer.Count >= 5)//設備地址 功能碼 長度 2字節校驗位 { if (buffer[0] == 0x01) { int len = buffer[2]; if (buffer.Count < len + 5) break;//數據尚未接收完整 buffer.CopyTo(0, ReceiveBytes, 0, len+5);//得到完整數據,將數據複製到ReceiveBytes中 buffer.RemoveRange(0, len+5);//將buffer中從0開始len+5長度的數據移除 } byte[] ReceiveData = new byte[len + 5];//完整的接收數組 for (int i =0; i < len+5, i++) { ReceiveDate[i] = ReceiveBytes[i];//將中轉的完整的接收數組賦值給完整的接收數組 } } } catch (Exception ex)//出現異常時顯示異常 { MessageBox.Show(DateTime.Now.ToString("HH:mm:ss") + " 接收數據處出現異常 " + ex.Message); }
over~~~

浙公网安备 33010602011771号