C#serialPort类接受数据时有时不能完整接受,要延时?

qq_2205140725 2017-06-21 08:49:43
我的笔记本利用CH340实现上位机自己收发数据,有时还没发送完,datareceive事件就发生然后还接受不到完整的数据,接受部分代码如图:
...全文
560 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_2205140725 2017-06-30
  • 打赏
  • 举报
回复
引用 9 楼 hovoy 的回复:
有个现成类,实现的很完美。。可以下载到。
谢谢 我已经搞定
hovoy 2017-06-24
  • 打赏
  • 举报
回复
有个现成类,实现的很完美。。可以下载到。
qq_2205140725 2017-06-23
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
有时还没发送完,datareceive事件就发生然后还接受不到完整的数据 -》你只有通过校验数据的完整性 来判断是否发送完毕。 也就是接受的数据有时候不完整,就需要拼接处理,达到一定格式了再返回出来,你没有一个特定的格式要求,永远都是不完整的数据。
谢谢 你的建议很有用
bloodish 2017-06-22
  • 打赏
  • 举报
回复

BlockingCollection<byte> dataQueue = new BlockingCollection<byte>(); 
            SerialPort port = new SerialPort();
            byte[] buffer =new byte[1024];
            port.DataReceived += (s, e) =>
            {
                //assume the bytes to read won't larger than 1024 bytes
                if(port.BytesToRead > 0)
                {
                    int readCount = port.Read(buffer, 0, port.BytesToRead);
                    for(int i=0;i<readCount;i++)
                    {
                        //enqueue data
                        dataQueue.Add(buffer[i]);
                    }
                }
              
            };           
            //A standalone task to handle the message data
            Task.Factory.StartNew(() =>
            {
                List<byte> msgBuffer = new List<byte>();
                const int MSGSIZE = 64;
                foreach(var data in dataQueue.GetConsumingEnumerable())
                {
                    msgBuffer.Add(data);
                    if(msgBuffer.Count == MSGSIZE)
                    {
                        //todo
                        msgBuffer.Clear();
                    }
                }
            });
  • 打赏
  • 举报
回复
有时还没发送完,datareceive事件就发生然后还接受不到完整的数据 -》你只有通过校验数据的完整性 来判断是否发送完毕。 也就是接受的数据有时候不完整,就需要拼接处理,达到一定格式了再返回出来,你没有一个特定的格式要求,永远都是不完整的数据。
xian_wwq 2017-06-22
  • 打赏
  • 举报
回复
类似于tcp的“粘包”处理 把接收不全当做正常来处理 接收数据后,根据协议约定,来判定数据是否满足足长帧的需求 如果满足,则解析 如果不足,则继续接收
巴士上的邂逅 2017-06-22
  • 打赏
  • 举报
回复
定义一个全局变量byte[],收到数据往里存,接受完一帧处理完就清
zhujinqiang 2017-06-22
  • 打赏
  • 举报
回复
引用 2 楼 yuankaiwsl 的回复:
定义一个全局变量byte[],收到数据往里存,接受完一帧处理完就清
说得很对!
zhujinqiang 2017-06-22
  • 打赏
  • 举报
回复
收到的date先放在Buffer里面。
qq_2205140725 2017-06-21
  • 打赏
  • 举报
回复
帖子不要沉啊

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧