最近项目上在使用Zynq开发,也是第一次使用,期间会遇到各种各样的问题,属于Zynq本身问题的我会更新到我的另一篇博客《Zynq开发调试踩坑指南》中,这个版块将会陆续记录我自身在程序开发中的问题。
这次的问题是串口收数据问题,众所周知,我在一个月前就已经把串口调通了,收发试着也没啥问题。现在正在加一个通过串口远程升级的功能,也就是发的数据量大了,几十毫秒一帧数据,每一帧都有个一百多字节,然后就发现偶尔收的数据CRC校验对不上,仔细核对发现是少收了一个字节了。
我一开始是怀疑收数据的软件层驱动不对。毕竟整个软件层都是我自己写的,也没大量验证过,于是直接看串口收的memory中数据确实是少一个字节。
于是就怀疑串口线的问题,因为我现在跑的波特率是2Mbps,就单独拿串口线自发自收,倒是没有问题,说明硬件链路是没问题的。
这时候我就开始合理推测了,我看到丢字节的数组位置大概在第64这个位置,心里一个不成熟的想法就浮出水面。
我的Zynq串口收数据是使用FIFO溢出中断+超时中断的方式来获取数据的。超时中断大家都懂,stm32单片机里有这个概念。就是单个字节发完后多长时间内如果没有新的比特进来,就认为是超时了,这时候你想要的数据就都已经在缓存区里了。不同于stm32超时中断需要配置DMA,Zynq本身有FIFO,中断后直接读FIFO就可以了。但是这个FIFO是有空间限制的,收发缓存都只有64字节的大小。如果一次收到的数据不足64字节,倒是可以直接读完一帧,那如果收到的数据比64字节多呢?
这时候就需要FIFO溢出中断和超时中断一起配合使用了。我开辟一个空间,FIFO溢出后我把FIFO里的数据全部读走,再来数据在之前的空间上叠加数据ÿ