您的位置:首页 > 编程语言 > C#

C# SerialPort异步读取总结

2012-05-23 15:58 453 查看
  笔者刚学C++++时,写了一个不太成熟的串口调试助手练练手,之前也曾用java写过serialPort,而在一次竞赛中终于对SerialPort稍作了专研。以下仅仅是个人笔记。

  C#提供用于串口通信的System.IO.Ports.SerialPort类,可方便地进行串口(支持RS232,对于RS485,笔者并未尝试)的读写操作。

一、几个特点

  对于SerialPort,有以下几点值得注意:

    1,ReadLine只可用于同步读取。在没有数据的时候,此函数将阻塞。

    2,SerialPort调用read系列函数(Read,ReadByte,ReabChar, ReadLine, ReadExisting等)时,所谓的缓冲区是不需要的,或者说读出的数据直接“流向”用户定义的byte[]或者string类型的变量中。对于Write也一样。所以,不存在flushRx或者flushTx的概念。

    3,尽管如一所述,串口本身的缓冲区还是存在的,也就是说,倘若下位机发送上来的数据未被读取,则会在数据量不超过缓冲区大小的情况下不断积压下来。笔者在这个问题上由于自己的疏忽,导致过不必要的麻烦。

    4,SerialPort的读数据函数多样,上面提到的Read,ReadByte,ReabChar, ReadLine, ReadExisting都可调用,虽然读取的都是符合一定格式的串口数据包(比特流),然而效果却不尽相同,具体原因笔者也不清楚,待对于串口通信的底层和应用层都精通的高手来解答。经过愚钝的笔者一通试验,那些函数可分为两类,一类是readbyte,即ReadByte,Read等,他们读出的数据存储在byte变量中。另一类是readchar,比如ReadChar,ReadExisting,二者读出的数据竟然不同。在我的试验中,readbyte函数读出ff ff时,readchar函数读出了3f 3f。

    5,如果串口未能读出正确的数值,可尝试插拔设备接口,原因亦为止,求高手指点!

二、代码部分

  不想听我废话?那就直接看代码:

  1,设置基本参数

  //设置SerialPort

  SerialPort serp = new SerialPort();

  serp.BaudRate = 115200;

  ......//参考msdn


  2,设定接收相关的参数

  //设置接收超时。一旦超时,将抛出Exception

  serp.serialport.ReadTimeout = 90 * 1000;

  //注册事件处理函数

  serp.serialport.DataReceived += new SerialDataReceivedEventHandler(this.serialport_DataReceived);

  serp.Open();


  3,定义接收事件处理函数

  //定义事件处理函数

  private serialport_DataReceived(Object sender, SerialDataReceivedEventArgs e)

  {

    try{

      Thread.Sleep(100);  //(毫秒)等待一定时间,确保数据的完整性 int len

      int len = serp.BytesToRead;

if( len!=0 )

      {

  byte [] buff = new byte[len];

        serp.Read(buff, 0, len);

        //try some other functions to read? do yourself if intersted

        //processing data in buff

      }

    }

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: