超出FIFO空间的串口数据收发

haoxuesheng1106 2010-05-12 01:29:31
大家好,正在做一个项目,通信芯片接收区FIFO大小为8word,数据收发通过调用一个函数完成,每次接收一个字节,通过调试发现,当一包数据大小在13、14个字节以内时,收发正常。现在需要通过串口做大数据量的收发,每包数据都在1000字节以上,因为我觉得FIFO每次取出一个数据后会自动在顶进来一个新数,所以我想通过在while(1)中不断地循环调用数据接收函数,接收到之后先放到一个自建的缓冲区中,等全部接收成功之后再做处理,现在通过调试发现当一包数据大于16个字节时,丢数现象严重,大概只能接收一半左右的数据(具体现象就是每次连续接收7、8个字节,然后会丢掉7、8个字节,接着再接收到7、8个字节,整体下来可能只能接到一半左右),我觉得可能是处理速度跟数据接收速度(baud率)匹配出了问题
大家帮我分析一下什么原因呢,还有该怎么解决
...全文
703 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wozhenchajin 2010-07-08
  • 打赏
  • 举报
回复
你控制串口通讯的是哪个芯片?16500吗?
haoxuesheng1106 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 peasant_lee 的回复:]
刚算了一下,你的波特率下,1 bit数据需要8us,1 btye 需要大概80us,应该够时间的。你DSP读fifo的速度应该很快的吧?还有,一旦读取fifo的一个数据,会不会误造成损害fifo的所有数据?
[/Quote]

读好意思,这里的DSP读fifo的时间怎么算呢,是不是跟串口收发定时器有关系呢,那个定时器的意思是不是就是每这么长时间读一次呢,计数器每记一次数应该是33.3ns,我现在计数器设的值是0x40,再大就会丢数
另外读fifo应该对后面的数据没有影响吧,该芯片支持的读写只是每次收或发一个字节,连续收发,我现在也是让它while(1)里面循环调用数据接收函数,连续性接收
Peasant_Lee 2010-05-13
  • 打赏
  • 举报
回复
刚算了一下,你的波特率下,1 bit数据需要8us,1 btye 需要大概80us,应该够时间的。你DSP读fifo的速度应该很快的吧?还有,一旦读取fifo的一个数据,会不会误造成损害fifo的所有数据?
haoxuesheng1106 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 peasant_lee 的回复:]
既然数据发送那部分已经确定,那么波特率估计已经也定死了。所以考虑波特率的设置也没用的。串口接收/发送定时器是不是用来设置波特率,要具体看芯片手册,有些是用定时器来做波特率发生器的,比如常用的51单片机,,你所说的一包数据有多大?相比你的fifo大多少?你现在的波特率是多少,算算理论值,看看能不能处理的过来。
[/Quote]

发送也是我自己通过一个软件发送的,波特率也是可调的,只是具体的协议定死了,也就是每包数据的大小及内容已经确定,不能更改了。
我的FIFO是8word的,一包数据最多的时候可能会到达1000字节以上
现在的波特率是115200,DSP用的是TMS320VC33,计数器每条指令时钟周期为33.3ns,应该是能处理过来的
Peasant_Lee 2010-05-13
  • 打赏
  • 举报
回复
既然数据发送那部分已经确定,那么波特率估计已经也定死了。所以考虑波特率的设置也没用的。串口接收/发送定时器是不是用来设置波特率,要具体看芯片手册,有些是用定时器来做波特率发生器的,比如常用的51单片机,,你所说的一包数据有多大?相比你的fifo大多少?你现在的波特率是多少,算算理论值,看看能不能处理的过来。
haoxuesheng1106 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guolh 的回复:]
发送时检测一下发送fifo是否为空,写发送数据时一次不能超过fifo大小,否则数据还没来得及发送就被覆盖了,接收同样要设置接收中断(几个字节),避免接收太多字节后再中断,如果软件响应中断处理的不及时,后续接收的数据就把接收fifo覆盖了!
[/Quote]

谢谢guolh
我也认为可能是一次发的数据过大,前面的还没处理完,就被后面的数据覆盖掉了,不过DSP处理器的速度远大于串口数据发送的速率,不应该出现这样的情况啊。
而且现在的问题是这样的,首先是关于数据发送那部分已经确定,不可更改,一包数据远大于FIFO大小,现在能做的就是在接收这里想想办法,看能不能更好的接收。其次我的程序里数据接收的时候没有用中断(硬件限制,用不了中断),只是不断的轮询,只要FIFO中有数就接收
guolh 2010-05-13
  • 打赏
  • 举报
回复
发送时检测一下发送fifo是否为空,写发送数据时一次不能超过fifo大小,否则数据还没来得及发送就被覆盖了,接收同样要设置接收中断(几个字节),避免接收太多字节后再中断,如果软件响应中断处理的不及时,后续接收的数据就把接收fifo覆盖了!
haoxuesheng1106 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 peasant_lee 的回复:]
引用 2 楼 haoxuesheng1106 的回复:
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些



串口接收/发送定时器应该是用来设置波特率的吧?具体看你的datasheet。想问问,你的系统是 DSP读串口数据,放到FIFO中吗?
[/Quote]

串口接收/发送定时器是用来设置波特率?那他们是什么关系呢,有没有计算公式呢。
另外不是dsp读串口数据放到FIFO中,而是DSP接到串口数据之后先放到FIFO中(自动完成,类似一个buffer),现在需要从FIFO中把相应数据读出来做进一步处理。
Peasant_Lee 2010-05-13
  • 打赏
  • 举报
回复
至于你的定时器是干什么的,我帮不了你咯,因为我又没看过你的datasheet。并不是单单看个称呼就可以知道它实际的功能。所以,我还是建议你好好看看这个寄存器,确定它是什么用的,然后,让我们来问你这个是干什么用的,这样才对,呵呵。

这里的DSP读fifo的时间怎么算呢?首先要有示波器,用过测试IO,然后再读前和读后,分别翻转一下电平,示波器看这两次翻转的时间间隔。
Peasant_Lee 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haoxuesheng1106 的回复:]
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些
[/Quote]


串口接收/发送定时器应该是用来设置波特率的吧?具体看你的datasheet。想问问,你的系统是 DSP读串口数据,放到FIFO中吗?
haoxuesheng1106 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 peasant_lee 的回复:]
是不是你的主程序了还开了其他的中断之类的?该接数的时候,跑去响应中断了。
[/Quote]

这个我也考虑到了,现在的主程序已经是最简化的了,只有串口读写程序程序,没有其他任何操作,而且串口读写也没有用中断方式,只是通过while(1)里面循环调用串口接收函数不断轮询,只要有数就接收,而且DSP的处理速度远大于串口收发速率,不应该出这样的问题啊
Peasant_Lee 2010-05-12
  • 打赏
  • 举报
回复
是不是你的主程序了还开了其他的中断之类的?该接数的时候,跑去响应中断了。
haoxuesheng1106 2010-05-12
  • 打赏
  • 举报
回复
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些
老人参 2010-05-12
  • 打赏
  • 举报
回复
帮你顶

2,432

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧