一、问题概况
上位机用于采集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变成一帧中间的一个数,最终没有进入解析。
经试验发现&#