page contents

c# 串口通信 DataReceived 事件触发方法的使用

本文讲述了c# 串口通信 DataReceived 事件触发方法的使用!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-05-Qg4J6Ikm627dafdaec82c.png本文讲述了c# 串口通信 DataReceived 事件触发方法的使用!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

DataReceived事件:在接收到了ReceivedBytesThreshold设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。数据接收的方法如果采用轮询的方法比较浪费时间,采用DataReceived事件触发的方法,合理的设置ReceivedBytesThreshold的值,若接收的是定长的数据,则将ReceivedBytesThreshold设为接收数据的长度,若接收数据的结尾是是固定的字符或字符串则可采用ReadTo的方法或在DataReceived事件中判断接收的字符是否满足条件。SerialPort读取数据的许多方法都是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。

Hcom.DataReceived += new SerialDataReceivedEventHandler(H_Decode_com_DataReceived);

Hcom.ReceivedBytesThreshold = 13;

开始时我用while阻塞的方式来保证每次触发DataReceived时把数据取完整:

void H_Decode_com_DataReceived(object sendr, SerialDataReceivedEventArgs e)

{

    byte[] Resoursedata = new byte[6];

    while (Hcom.BytesToRead < 6)

    {

        Thread.Sleep(1);

    }

 

    if (Hcom.BytesToRead >= 6)

    {

         Hcom.Read(Resoursedata, 0, 6);

         if (Resoursedata[3] == (byte)0x01)

    {

         while (Hcom.BytesToRead < 7)

         {

             Thread.Sleep(5);

         }

         if (Hcom.BytesToRead >= 7)

         {

             byte[] HReadbuffer = new byte[7];

             Hcom.Read(HReadbuffer, 0, 7);

             DeviceHandler._HPcmToAmbeBufferQueue.SendMsg(HReadbuffer);

         }

    }

    else if (Resoursedata[3] == (byte)0x02)

    {

 

         while (Hcom.BytesToRead < 320)

         {

              Thread.Sleep(5);

         }

 

              byte[] HReadbuffer = new byte[320];

              Hcom.Read(HReadbuffer, 0, 320);

              DeviceHandler._HAmbeToPcmBufferQueue.SendMsg(HReadbuffer);

    }

    else

    {

        Log.Error("BytesToRead error");

        Hcom.DiscardInBuffer();

    }

}

但测试时发现这种方式在遇到串口数据过大时会导致CPU占用率过高

之后更改为:

void H_Decode_com_DataReceived(object sendr, SerialDataReceivedEventArgs e)

        {

            int readByte = Hcom.BytesToRead;

            byte[] Resoursedata = new byte[13];

            if (readByte >= 13)

            {

                if (step == 0)

                {

                    Hcom.Read(Resoursedata, 0, 6);

                    if (Resoursedata[3] == (byte)0x01)

                    {

                        byte[] HReadbuffer = new byte[7];

                        Hcom.Read(WTReadbuffer, 0, 7);

                        DeviceHandler._HPcmToAmbeBufferQueue.SendMsg(HReadbuffer);

                    }

                    else if (Resoursedata[3] == (byte)0x02)

                    {

                        step++;

                    }

                }

                else if (step > 0)

                {

                    if (readByte >= 320)

                    {

                        byte[] HReadbuffer = new byte[320];

                        Hcom.Read(HReadbuffer, 0, 320);

                        DeviceHandler._HAmbeToPcmBufferQueue.SendMsg(HReadbuffer);

                        step = 0;

                    }

                }

            }

        }

因为C# serialport 提供的DataReceived,当触发了事件后就会调用事件函数,不论之前那个有没有处理完,所以每次调用事件函数时一定要保证快速的执行完,防止下次的触发事件在上一次还没执行完就又开始了。所以最后改为每次只检查串口接收缓冲区中存储的数据量,不在那里等待,直到满足数量要求后再取出来。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-gx5sTJ8z62b415a9733c6.jpeg

  • 发表于 2022-05-13 09:10
  • 阅读 ( 909 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章