最近受朋友委託,幫他寫一個讀取串口的程式。以前只知道需要調用Windows API來實現,查詢了MSDN之後發現,從.Net framework 2.0開始,.Net內部已經封裝了SerialPort類,使得讀取串口內容變得非常容易。
SerialPort位於System.IO.Ports namspace下面。常用的建構函式為
1: public SerialPort(
2: string portName,
3: int baudRate,
4: Parity parity,
5: int dataBits,
6: StopBits stopBits
7: )
- portName:連接埠號碼,如COM1,COM2,COM3……
- baudRate:每秒資料位元,如9600
- parity:是否有同位
- dataBits:資料位元
- stopBits:停止位
這些可以更據具體的硬體指標設定。
此外SerialPort類,還提供了以下屬性。
Handshake:設定握手協議,(None,XOnXOff,RequestToSend 和 RequestToSendXOnXOff
WriteTimeout:寫入資料時,多久逾時
ReadTimeout:讀取資料時,多久逾時
我主要是通過竄口讀取資料,所以使用了SerialPort類的DataReceived事件,這個事件調用的時候要注意一點。我們不可以再這個事件內直接更新UI內容,如給textbox賦值。微軟的官方解釋是,這個事件其實是在另外一個線程(非GUI線程)內觸發的。
以下是我的一個簡單範常式序:
1: using System;
2: using System.ComponentModel;
3: using System.Drawing;
4: using System.IO.Ports;
5: using System.Windows.Forms;
6:
7: namespace Reader
8: {
9: public partial class MainForm : Form
10: {
11: private static SerialPort _serialPort = null;
12:
13: public MainForm()
14: {
15: InitializeComponent();
16: }
17:
18: void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
19: {
20: this.Invoke(new EventHandler(DoUpdate));
21: }
22:
23: private void DoUpdate(object s, EventArgs e)
24: {
25: this.lbText.Text = _serialPort.ReadExisting();
26: }
27:
28: private void btnStart_Click(object sender, EventArgs e)
29: {
30: _serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
31: _serialPort.Handshake = Handshake.RequestToSendXOnXOff;
32: _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
33: _serialPort.Open();
34:
35: this.btnStart.Enabled = false;
36: }
37: }
38: }
介面。代碼就不貼了。