標籤:logs 執行 highlight [] exist orm style 接收 try
本文提供一個用C#實現串口通訊執行個體,親自編寫,親測可用!
開發環境:VS2008+.net FrameWork3.5(實際上2.0應該也可以)
第一步
建立一個WinForm表單,拉入一些介面元素
重點就是,圖中用紅框標出的,工具箱——組件——SerialPort,做.net串口通訊,這是必備控制項
第二步
設定SerialPort控制項屬性
用C#向串口發送資料沒什麼特別的,就是調用SerialPort的Write方法往串口寫資料就行
但是從串口那裡接收資料的方式就比較特別了
首先,需要在代碼裡聲明一個特別的事件函數
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; } } }}
至此,一個簡單完整的串口通訊就完成了,希望對你們有所協助
轉載請別忘了標明出處,謝謝~
C#串口通訊