• C# SerialPort异步读取总结


      笔者刚学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,设置基本参数

    1   //设置SerialPort
    2 
    3   SerialPort serp = new SerialPort();
    4 
    5   serp.BaudRate = 115200;
    6 
    7   ......//参考msdn

      2,设定接收相关的参数

    1   //设置接收超时。一旦超时,将抛出Exception
    2 
    3    serp.serialport.ReadTimeout = 90 * 1000;
    4 
    5   //注册事件处理函数
    6 
    7   serp.serialport.DataReceived += new SerialDataReceivedEventHandler(this.serialport_DataReceived);
    8 
    9   serp.Open(); 

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

     1   //定义事件处理函数
     2 
     3   private serialport_DataReceived(Object sender, SerialDataReceivedEventArgs e)
     4 
     5   {
     6 
     7     try{
     8 
     9       Thread.Sleep(100);  //(毫秒)等待一定时间,确保数据的完整性 int len        
    10 
    11       int len = serp.BytesToRead;
    12 
    13                  if( len!=0 )
    14 
    15       {
    16 
    17                    byte [] buff = new byte[len];
    18 
    19         serp.Read(buff, 0, len);
    20 
    21         //try some other functions to read? do yourself if intersted
    22 
    23         //processing data in buff
    24 
    25       }
    26 
    27     }
    28 
    29   }


     

  • 相关阅读:
    nodejs安装
    Python基本知识3----序列
    jdk环境变量配置
    sublime text3插件的安装
    QTP基本方法4------手动写入信息到测试结果报告中
    QTP基本方法3-----截屏
    QTP基本方法2------截取字符串
    QTP基本方法
    python文件操作指令
    XSStrike工具的安装使用
  • 原文地址:https://www.cnblogs.com/zhchngzng/p/2514914.html
Copyright © 2020-2023  润新知