如何使用C#读取串口信息

最近受朋友委托,帮他写一个读取串口的程序。以前只知道需要调用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:  )
  1. portName:端口号,如COM1,COM2,COM3……
  2. baudRate:每秒数据位,如9600
  3. parity:是否有奇偶校验
  4. dataBits:数据位
  5. 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:  }
 
界面截图。代码就不贴了。
image
 

posted @ 2010-12-24 11:13  Justin Zhang  阅读(11217)  评论(0编辑  收藏  举报