c# 實現(xiàn)簡單的串口通訊
本文提供一個用C#實現(xiàn)串口通訊實例,親自編寫,親測可用!
開發(fā)環(huán)境:
VS2008+.net FrameWork3.5(實際上2.0應(yīng)該也可以)
第一步
創(chuàng)建一個WinForm窗體,拉入一些界面元素
重點就是,圖中用紅框標出的,工具箱——組件——SerialPort,做.net串口通訊,這是必備控件
第二步
設(shè)置SerialPort控件屬性
用C#向串口發(fā)送數(shù)據(jù)沒什么特別的,就是調(diào)用SerialPort的Write方法往串口寫數(shù)據(jù)就行
但是從串口那里接收數(shù)據(jù)的方式就比較特別了
首先,需要在代碼里聲明一個特別的事件函數(shù)
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(UpdateUIText)); }
此函數(shù)是用來綁定到SerialPort控件的DataReceived事件
顧名思義,這個事件就是在接收到串口返回的數(shù)據(jù)時觸發(fā),里面就一句代碼
對這句代碼有興趣的可以私下再去研究,這里就不贅述了
總之,這句代碼的用途就是用來調(diào)動另一個函數(shù),對界面UI元素的值進行更新(當然你也可以在里面執(zhí)行其他操作)
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;//數(shù)據(jù)位 serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位 serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解決接收中文亂碼的問題 // 打開串口 try { serialPort.Open(); } catch (Exception ex) { //捕獲到異常信息,創(chuàng)建一個新的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# 實現(xiàn)簡單的串口通訊的詳細內(nèi)容,更多關(guān)于c# 串口通訊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程
這篇文章主要介紹了C#操作LINQ to SQL組件進行數(shù)據(jù)庫建模的基本教程,LINQ to SQL被集成在.NET框架之中,需要的朋友可以參考下2016-03-03將DataTable轉(zhuǎn)換成List<T>實現(xiàn)思路及示例代碼
首先,這是我寫的一個通用轉(zhuǎn)換類,完成此類操作。也是實現(xiàn)這個功能最核心的部分。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11visio二次開發(fā)--判斷文檔是否已發(fā)生變化(變化就加星號*)
最近做一個故障樹診斷的項目,用visio二次開發(fā),可以同時打開多個繪制的故障樹圖形文檔。項目中需要實現(xiàn)判斷文檔是否發(fā)生變化,這是很多編輯軟件的基本功能,變化了就加個星號*2013-04-04