最近受朋友委托,帮他写一个读取串口的程序。以前只知道需要调用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: }
界面截图。代码就不贴了。