本文提供一個用C#實現串口通信實例,親自編寫,親測可用!函數
開發環境:VS2008+.net FrameWork3.5(實際上2.0應該也能夠)工具
第一步this
建立一個WinForm窗體,拉入一些界面元素spa
重點就是,圖中用紅框標出的,工具箱——組件——SerialPort,作.net串口通信,這是必備控件.net
第二步線程
設置SerialPort控件屬性code
用C#向串口發送數據沒什麼特別的,就是調用SerialPort的Write方法往串口寫數據就行orm
可是從串口那裏接收數據的方式就比較特別了對象
首先,須要在代碼裏聲明一個特別的事件函數blog
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(UpdateUIText)); }
此函數是用來綁定到SerialPort控件的DataReceived事件
顧名思義,這個事件就是在接收到串口返回的數據時觸發,裏面就一句代碼
對這句代碼有興趣的能夠私下再去研究,這裏就不贅述了
總之,這句代碼的用途就是用來調動另外一個函數,對界面UI元素的值進行更新(固然你也能夠在裏面執行其餘操做)
private void UpdateUIText(object s, EventArgs e) { try { //必需要阻塞線程一段時間,以避免在交易超時的狀況下,因爲read太快致使讀取不完整 System.Threading.Thread.Sleep(500); string txt = serialPort.ReadExisting(); txt_Received.Text = txt; } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } }
第三步
開始寫邏輯代碼,廢話很少說,直接貼上來
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinForm串口通信 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string[] ports = System.IO.Ports.SerialPort.GetPortNames(); if (ports.Length == 0) { MessageBox.Show("本機沒有串口!"); } Array.Sort(ports); serialPort.PortName = ports[0];//串口號COM3 serialPort.BaudRate = 115200;//波特率 serialPort.DataBits = 8;//數據位 serialPort.StopBits = System.IO.Ports.StopBits.One;//中止位 serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行很是重要,解決接收中文亂碼的問題 // 打開串口 try { serialPort.Open(); } catch (Exception ex) { //捕獲到異常信息,建立一個新的comm對象,以前的不能用了。 serialPort = new System.IO.Ports.SerialPort(); //將異常信息傳遞給用戶。 MessageBox.Show(ex.Message); return; } } private void button1_Click(object sender, EventArgs e) { string msgOrder = txt_Msg.Text; //MessageBox.Show(msgOrder); serialPort.Write(msgOrder); } private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(UpdateUIText)); } private void UpdateUIText(object s, EventArgs e) { try { //必需要阻塞線程一段時間,以避免在交易超時的狀況下,因爲read太快致使讀取不完整 System.Threading.Thread.Sleep(500); string txt = serialPort.ReadExisting(); txt_Received.Text = txt; } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { if (serialPort != null && serialPort.IsOpen) { serialPort.Close(); serialPort.Dispose(); } } catch (Exception ex) { //將異常信息傳遞給用戶。 MessageBox.Show(ex.Message); return; } } } }
至此,一個簡單完整的串口通信就完成了,但願對大家有所幫助
轉載請別忘了標明出處,謝謝~