zoukankan      html  css  js  c++  java
  • 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   }


     

  • 相关阅读:
    JavaScript 为字符串添加样式 【每日一段代码80】
    JavaScript replace()方法 【每日一段代码83】
    JavaScript for in 遍历数组 【每日一段代码89】
    JavaScript 创建用于对象的模板【每日一段代码78】
    html5 css3 新元素简单页面布局
    JavaScript Array() 数组 【每日一段代码88】
    JavaScript toUTCString() 方法 【每日一段代码86】
    位运算
    POJ 3259 Wormholes
    POJ 3169 Layout
  • 原文地址:https://www.cnblogs.com/zhchngzng/p/2514914.html
Copyright © 2011-2022 走看看