C#编写的winform上位机采集FPGA上发的1000Hz数据丢数问题解决记录

一、问题概况

上位机用于采集FPGA上发的1000Hz数据,每帧数据为49字节,波特率为641100,丢数现象比较频繁,大约20分钟内会出现3、4次。

二、上位机数据采集策略

定义了一个数组(byte[] order = new byte[4096])用于缓存收到的数据,串口收到的数据会缓存在长度为65535的缓存区中,使用serialport自带的数据读取函数,将缓存区中的数据赋值给order数据,同时处理完的数据不断移位。

三、分析

由于最早数据采集是以400Hz,出现问题的频率要比现在低很多,所以在频率提高后最先怀疑的是波特率不够,1000Hz,49字节一帧的数据已经占据了近80%,所以最初提高了波特率至921600,重新试验发现,似乎不丢数了,但在后续试验过程中还是出现了丢数的现象,而且基本上都丢失85帧。

85帧刚好是一个order的大小,所以扩充了order的长度至8192,测试发现丢数帧数变成了170帧。

四、结局

在对order数组缓存的数据一遍遍的分析,各种打断点和写陷阱调试,最终终于分析出了原因,并加以验证。

原来在算法计算和移位过程中,很多循环需要使用循环数组,就使得用了很多取余操作,由于取余操作运算速度较慢,数据存入和数据处理速度存在时间差,存入速度较快,串口缓存区中会不断积攒数据,然后在order数据处理完时再一次性赋给order,当数据量超出order长度时,后半部分数据会覆盖掉前半部分数据,导致帧头处原本是正确的BB变成一帧中间的一个数,最终没有进入解析。

经试验发现&#

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值