qq_39342570 2023-02-16 02:06 采纳率: 66.7%
浏览 59
已结题

串口接收丢失数据问题

串口接收丢失数据问题

我在使用串口转usb接收解析数据,10分钟发一次,一小时应该收到六条数据,但是接收不稳定,有时候只能接到3条。
但是用串口助手去发送,就不会丢数据。

希望看到的老哥能指出哪里有问题。

  1. //不考虑帧头帧尾和校验之类的问题
  2. private List<byte> buffer = new List<byte>(2048);
  3. private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  4. {
  5. Thread.Sleep(100);//添加延时
  6. // 读取有效的数据
  7. byte[] dataTemp = new byte[serialPort1.BytesToRead];
  8. serialPort1.Read(dataTemp, 0, dataTemp.Length);
  9. buffer.AddRange(dataTemp);
  10. int index = 1;
  11. while (buffer.Count >= 1)
  12. {
  13. if (buffer[0] == 0x24) //判断收到的首字符 $
  14. {
  15. if (buffer[index] != 0x24) //直到收到尾字符为$停下
  16. {
  17. index++;
  18. if (index >= buffer.Count)
  19. {
  20. break;
  21. }
  22. }
  23. else
  24. {
  25. byte[] ReceiveBytes = new byte[index];
  26. buffer.CopyTo(0, ReceiveBytes, 0, index);
  27. if (ReceiveBytes.Length >= 84)//实际发送的长度是111,但是需要只保留前84位的数据
  28. {
  29. AnalysisData(ReceiveBytes);//去解析数据
  30. buffer.Clear();
  31. }
  32. else
  33. {
  34. buffer.Clear();
  35. break;
  36. }
  37. }
  38. }
  39. else
  40. {
  41. buffer.Clear();//接收字符不对,删除
  42. }
  43. }
  44. }

展开全部

  • 写回答

3条回答 默认 最新

  • 於黾 2023-02-16 02:27
    关注

    serialPort1_DataReceived只能保证缓冲区里有数据
    并不保证没有后续数据
    你实际接收的字节数是111,如果波特率是9600,sleep(100)并不足以让111个字节发送完成
    你应该给串口设置超时时间,然后开始while接收,直到接收满111个字节,或者超时,才能说明后续确实没有更新的数据了
    或者在多次触发serialPort1_DataReceived执行的过程中,将收到的字节缓存在全局数组里,等待数据完整了再统一处理
    另,调试的时候不要直接断点调,断点的时候等待时间足够长,那缓冲区里数据保证是全的
    你应该在判断收到的数据无效的地方打个断点,看收到的到底是什么

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月17日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥20 校园网认证openwrt插件
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
  • ¥15 求GCMS辅导数据分析
  • ¥30 SD中的一段Unet下采样代码其中的resnet是谁跟谁进行残差连接
  • ¥15 Unet采样阶段的res_samples问题
  • ¥15 R语言regionNames()和demomap()无法选中中文地区的问题
  • ¥15 Open GL ES 的使用
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部