整理參考自《Visual C#.NET 串口通信及測控應用典型實例》1.3 節 以及 一篇博文:C# 串口操作系列(1) -- 入門篇,一個標准的,簡陋的串口例子。
硬件部分
如果是兩個串口設備,把其中一個的 2、3、5 引腳分別連接到另一個的 3、2、5 引腳即可。
如果是單個串口設備,則將其2、3引腳相連就行了。
如果沒有串口設備,可以使用軟件(Virtual Serial Port Driver)模擬串口。
硬件連接好之后,可以先下載一個“串口調試助手1”測試串口連接是否正常。
軟件部分
利用 .NET 平台下的 SerialPort 控件。
通信接收實現方式:
1. 查詢方式:通過一個計數器,定時查詢是否有可接受的內容。
界面如下:
實現代碼:
using System; using System.Windows.Forms; namespace QueryMode { public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private void FormMain_Load(object sender, EventArgs e) { spSend.PortName = "COM2"; spSend.BaudRate = 9600; spSend.Open(); spReceive.PortName = "COM3"; spReceive.BaudRate = 9600; spReceive.Open(); timerReceive.Start(); } private void btnSend_Click(object sender, EventArgs e) { string dataToSend = txtSend.Text; if (dataToSend == "") { MessageBox.Show("發送數據不能為空"); } else { spSend.Write(dataToSend); } } private void timerReceive_Tick(object sender, EventArgs e) { string dataReceived; dataReceived = spReceive.ReadExisting(); txtRecevie.AppendText(dataReceived); } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { spSend.Close(); spReceive.Close(); } } }
2. 事件方式:利用 SerialPort 控件的 DataReceived 事件。
界面部分基本同上,只是不需要 timer 控件了。
實現代碼:
using System; using System.Windows.Forms; namespace EventMode { public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private void FormMain_Load(object sender, EventArgs e) { spSend.PortName = "COM2"; spSend.BaudRate = 9600; spSend.Open(); spReceive.PortName = "COM3"; spReceive.BaudRate = 9600; spReceive.Open(); } private void btnSend_Click(object sender, EventArgs e) { string dataToSend = txtSend.Text; if (dataToSend == "") { MessageBox.Show("發送數據不能為空"); } else { spSend.Write(dataToSend); } } private void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string dataReceived; dataReceived = spReceive.ReadExisting(); this.Invoke((EventHandler)delegate { txtRecevie.AppendText(dataReceived); }); } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { spSend.Close(); spReceive.Close(); } } }
需要說明的是,在 DataReceived 事件處理方法中,在用到主窗體的 TextBox 控件時,要通過控件的 invoke 方法,否則會出現線程間的操作問題:
注1:串口調試助手軟件主頁:http://www.gjwtech.com/(用 Chrome 打開時提醒“存在惡意軟件”,請謹慎操作。)
備選下載地址:http://pan.baidu.com/s/16AzRO(串口調試助手V2.2)
注2:程序完整解決方案下載:http://pan.baidu.com/s/1d4om3(VS2010 版)