通過串口讀寫數據,非常簡單,只需要將控制拉到窗口位置即可,就可以在窗口的下方查看到串口控件的圖標,點擊圖標,按下F4即可查看該串品的詳細屬性
也可以通過在代碼中創建一個串口類,並在代碼中直接操作串口收發數據
其中包括比較基礎的端口名稱、波特率、數據位、停止位、檢驗位等五個參數
也有只需要指定端口名稱即可,其他參數保持默認
知識點:向串口發送數據並獲取數據
只需要將serialPort加入至窗口中,並且指定其中的端口名及波特率,指定串口數據回應事件即可(DataReceived事件) 然后在窗口加載事件中,將serialPort打開即可 1,直接使用serialPort.writeLine方法即可將數據發送至端口 2,已為serialPort指定了數據回應事件,當有數據從串口中返回,事件即會響應
示例項目
系統啟動三個后台線程,
一個線程對應到更新當前時間
一個線程定時發送AA1086至串口7,並從串口7獲得返回的數據
一個線程定時獲取串口1的數據(修改為不需要后台線程)
示例代碼
兩個基礎類,線程及定時,存放在Common文件夾中

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace MES_MonitoringClient.Common { /// <summary> /// 多線程任務 /// </summary> public class ThreadHandler { // Thread _TThread = null; //默認后台運行 private const bool default_isBackground = true; //默認不自動運行 private const bool default_autoRun = false; public ThreadHandler(System.Threading.ThreadStart startFunction) : this(startFunction, default_isBackground, default_autoRun) { } public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground) : this(startFunction, isBackground, default_autoRun) { } /// <summary> /// 創建線程 /// </summary> /// <param name="startFunction">運行方法</param> /// <param name="isBackground">是否后台運行</param> /// <param name="autoRun">是否自動運行</param> public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground, bool autoRun) { _TThread = new Thread(startFunction); //是否后台運行 _TThread.IsBackground = isBackground; //自動運行線程 if (autoRun) { _TThread.Start(); } } /// <summary> /// 開始線程 /// </summary> public void ThreadStart() { _TThread.Start(); } /// <summary> /// 查看線程執行狀態 /// </summary> /// <returns></returns> public bool ThreadIsAlive() { return _TThread.IsAlive; } /// <summary> /// 查看線程 /// 前后台執行 /// </summary> /// <returns></returns> public string ThreadState() { return _TThread.ThreadState.ToString(); } /// <summary> /// 當前線程唯一托管標識符 /// </summary> /// <returns></returns> public int ThreadManagedThreadId() { return _TThread.ManagedThreadId; } /// <summary> /// 等待線程結束 /// </summary> public void ThreadJoin() { _TThread.Join(); } } }

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MES_MonitoringClient.Common { /// <summary> /// 定時器幫助類 /// 創建定時器=》開始執行任務 /// </summary> public class TimmerHandler { //定時器 System.Timers.Timer _TTimer = null; //定時器默認執行一次 private const bool default_autoReset = false; //定時器默認一秒執行一次 private const int default_interval = 1000; //定時器創建后即刻運行 private const bool default_autoRun = false; public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent) : this(default_interval, elapseEvent, default_autoRun) { } public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(default_interval, elapseEvent, autoRun) { } public TimmerHandler(int interval, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(interval, default_autoReset, elapseEvent, autoRun) { } /// <summary> /// 創建定時器 /// </summary> /// <param name="interval">間隔時間(ms)</param> /// <param name="autoReset">是否重復執行</param> /// <param name="elapseEvent">定時事件</param> /// <param name="autoRun">是否自動運行</param> public TimmerHandler(int interval, bool autoReset, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) { _TTimer = new System.Timers.Timer(); //時間間隔 _TTimer.Interval = interval; //是否重復執行 _TTimer.AutoReset = autoReset; //定時器處理事件 _TTimer.Elapsed += elapseEvent; //定時器自動運行 if (autoRun) { _TTimer.Start(); } } /// <summary> /// 定時器是否可用 /// </summary> /// <returns></returns> public bool GetTimmerEnable() { return _TTimer.Enabled; } /// <summary> /// 開始定時器任務 /// </summary> public void StartTimmer() { _TTimer.Start(); } /// <summary> /// 關閉定時器任務 /// </summary> public void StopTimmer() { _TTimer.Stop(); } /// <summary> /// 刪除定時器 /// </summary> public void RemoveTimmer() { _TTimer.Stop(); _TTimer.Dispose(); } } }
最后是窗體的代碼

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using System.Diagnostics; namespace MES_MonitoringClient { public partial class frmMain : Form { /*---------------------------------------------------------------------------------------*/ //發送信號數量 static int sendDataCount = 0; //接收信號數量 static int receviedDataCount = 0; //發送信號錯誤數量 static int sendDataErrorCount = 0; //接收信號錯誤數量 static int receviedDataErrorCount = 0; //向串口7發送的默認信號 static string mc_DefaultSignal = "AA1086"; //必須的串口端口 static string[] mc_DefaultRequiredSerialPortName = new string[] { "COM1", "COM7" }; //三個后台線程 static Common.ThreadHandler DateTimeThreadHandler = null; static Common.ThreadHandler SerialPort1ThreadHandler = null; static Common.ThreadHandler SerialPort7ThreadHandler = null; /*---------------------------------------------------------------------------------------*/ //后台線程變量 Thread timerThread = null; //定時器變量 System.Timers.Timer TTimer; /*主窗口方法*/ /*---------------------------------------------------------------------------------------*/ public frmMain() { InitializeComponent(); } /// <summary> /// 主窗口加載事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmMain_Load(object sender, EventArgs e) { try { var sw = Stopwatch.StartNew(); //檢測端口 //打開端口 serialPort7.Open(); serialPort1.Open(); //開始后台進程 DateTimeThreadHandler = new Common.ThreadHandler(new ThreadStart(DateTimeTimer), true, true); //SerialPort1ThreadHandler = new Common.ThreadHandler(new ThreadStart(GetRFIDDataTimer), true, true); SerialPort7ThreadHandler = new Common.ThreadHandler(new ThreadStart(SendDataToSerialPortTimer), true, true); label2.Text = DateTimeThreadHandler.ThreadState(); //MessageBox.Show("初始化共使用" + sw.ElapsedMilliseconds.ToString() + "毫秒"); sw.Stop(); } catch (Exception ex) { ShowErrorMessage(ex.Message, "系統初始化"); } } /// <summary> /// 主窗口關閉中事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void frmMain_FormClosing(object sender, FormClosingEventArgs e) { DateTimeThreadHandler.ThreadJoin(); //SerialPort1ThreadHandler.ThreadJoin(); SerialPort7ThreadHandler.ThreadJoin(); if (serialPort1.IsOpen) { serialPort1.Close(); } if (serialPort7.IsOpen) { serialPort7.Close(); } } /*定時器方法*/ /*---------------------------------------------------------------------------------------*/ /// <summary> /// 顯示時間定時器 /// </summary> private void DateTimeTimer() { Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => { SetDateTime(); }, true); } /// <summary> /// 獲取串口1RFID定時器 /// </summary> private void GetRFIDDataTimer() { Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => { GetRFIDData(mc_DefaultSignal); }, true); } /// <summary> /// 發送AA1086至串口7定時器 /// </summary> private void SendDataToSerialPortTimer() { Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => { SendDataToSerialPort(mc_DefaultSignal); }, true); } /*定時器委托*/ /*---------------------------------------------------------------------------------------*/ /// <summary> /// 聲明顯示當前時間委托 /// </summary> private delegate void SetDateTimeDelegate(); private void SetDateTime() { if (this.InvokeRequired) { try { this.Invoke(new SetDateTimeDelegate(SetDateTime)); } catch (Exception ex) { //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } else { try { label1.Text = string.Format("當前時間:" + DateTime.Now); } catch (Exception ex) { //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } } /// <summary> /// 聲明發送數據至串口委托 /// </summary> /// <param name="defaultSignal"></param> private delegate void SendDataToSerialPortDelegate(string defaultSignal); private void SendDataToSerialPort(string defaultSignal) { if (this.InvokeRequired) { SendDataToSerialPortDelegate sendDataToSerialPortDelegate = SendDataToSerialPort; try { this.Invoke(sendDataToSerialPortDelegate, new object[] { defaultSignal }); } catch (Exception ex) { //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } else { try { if (serialPort7.IsOpen) { serialPort7.WriteLine(defaultSignal); sendDataCount += 1; //lab_SendDataCount.Text = "發送成功:" + sendDataCount; } } catch (Exception ex) { sendDataErrorCount += 1; //lab_SendDataErrorCount.Text = "發送錯誤:" + sendDataErrorCount; //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } } /// <summary> /// 聲明獲取RFID串口委托 /// </summary> /// <param name="defaultSignal"></param> private delegate void GetRFIDDataDelegate(string defaultSignal); private void GetRFIDData(string defaultSignal) { if (this.InvokeRequired) { GetRFIDDataDelegate getRFIDDataDelegate = GetRFIDData; try { this.Invoke(getRFIDDataDelegate, new object[] { defaultSignal }); } catch (Exception ex) { //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } else { try { if (serialPort7.IsOpen) { serialPort7.WriteLine(defaultSignal); sendDataCount += 1; //lab_SendDataCount.Text = "發送成功:" + sendDataCount; } } catch (Exception ex) { sendDataErrorCount += 1; //lab_SendDataErrorCount.Text = "發送錯誤:" + sendDataErrorCount; //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } } /*窗口公共方法*/ /*---------------------------------------------------------------------------------------*/ /// <summary> /// 顯示系統錯誤信息 /// </summary> /// <param name="errorTitle">錯誤標題</param> /// <param name="errorMessage">錯誤</param> private void ShowErrorMessage(string errorTitle,string errorMessage) { MessageBox.Show(errorMessage, errorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); } /*獲取串口數據事件*/ /*---------------------------------------------------------------------------------------*/ /// <summary> /// 串口7獲取數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void serialPort7_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender; //因為要訪問UI資源,所以需要使用invoke方式同步ui this.Invoke((EventHandler)(delegate { receviedDataCount += 1; //lab_ReceviedDataCount.Text = "接收成功:" + receviedDataCount; richTextBox1.AppendText(COM.ReadLine() + "\r"); } ) ); } catch (Exception ex) { //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } /// <summary> /// 串口1獲取數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender; //因為要訪問UI資源,所以需要使用invoke方式同步ui this.Invoke((EventHandler)(delegate { richTextBox2.AppendText(COM.ReadLine() + "\r"); } ) ); } catch (Exception ex) { ShowErrorMessage("serialPort1_DataReceived", "RFID串口獲取數據時出錯"); //響鈴並顯示異常給用戶 System.Media.SystemSounds.Beep.Play(); } } private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e) { ShowErrorMessage("serialPort1_ErrorReceived", "RFID串口獲取數據出錯"); } } }