超出FIFO空间的串口数据收发解决方法
超出FIFO空间的串口数据收发大家好,正在做一个项目,通信芯片接收区FIFO大小为8word,数据收发通过调用一个
超出FIFO空间的串口数据收发
大家好,正在做一个项目,通信芯片接收区FIFO大小为8word,数据收发通过调用一个函数完成,每次接收一个字节,通过调试发现,当一包数据大小在13、14个字节以内时,收发正常。现在需要通过串口做大数据量的收发,每包数据都在1000字节以上,因为我觉得FIFO每次取出一个数据后会自动在顶进来一个新数,所以我想通过在while(1)中不断地循环调用数据接收函数,接收到之后先放到一个自建的缓冲区中,等全部接收成功之后再做处理,现在通过调试发现当一包数据大于16个字节时,丢数现象严重,大概只能接收一半左右的数据(具体现象就是每次连续接收7、8个字节,然后会丢掉7、8个字节,接着再接收到7、8个字节,整体下来可能只能接到一半左右),我觉得可能是处理速度跟数据接收速度(baud率)匹配出了问题
大家帮我分析一下什么原因呢,还有该怎么解决
[解决办法]
帮你顶
[解决办法]
是不是你的主程序了还开了其他的中断之类的?该接数的时候,跑去响应中断了。
[解决办法]
串口接收/发送定时器应该是用来设置波特率的吧?具体看你的datasheet。想问问,你的系统是 DSP读串口数据,放到FIFO中吗?
[解决办法]发送时检测一下发送fifo是否为空,写发送数据时一次不能超过fifo大小,否则数据还没来得及发送就被覆盖了,接收同样要设置接收中断(几个字节),避免接收太多字节后再中断,如果软件响应中断处理的不及时,后续接收的数据就把接收fifo覆盖了!
[解决办法]既然数据发送那部分已经确定,那么波特率估计已经也定死了。所以考虑波特率的设置也没用的。串口接收/发送定时器是不是用来设置波特率,要具体看芯片手册,有些是用定时器来做波特率发生器的,比如常用的51单片机,,你所说的一包数据有多大?相比你的fifo大多少?你现在的波特率是多少,算算理论值,看看能不能处理的过来。
[解决办法]刚算了一下,你的波特率下,1 bit数据需要8us,1 btye 需要大概80us,应该够时间的。你DSP读fifo的速度应该很快的吧?还有,一旦读取fifo的一个数据,会不会误造成损害fifo的所有数据?
[解决办法]至于你的定时器是干什么的,我帮不了你咯,因为我又没看过你的datasheet。并不是单单看个称呼就可以知道它实际的功能。所以,我还是建议你好好看看这个寄存器,确定它是什么用的,然后,让我们来问你这个是干什么用的,这样才对,呵呵。
这里的DSP读fifo的时间怎么算呢?首先要有示波器,用过测试IO,然后再读前和读后,分别翻转一下电平,示波器看这两次翻转的时间间隔。