xiyulang
驱动牛犊
驱动牛犊
  • 注册日期2005-09-06
  • 最后登录2010-07-22
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
阅读:5116回复:13

2440串口FIFO溢出问题

楼主#
更多 发布于:2007-01-15 09:12
系统是远峰提供的S3C2440+WINCE4.2,通过2440的UART0接口数据,当数据量较大时(超过100K)出现丢失数据现象,通过在驱动中读取2440的UART0的出错状态寄存器,发现硬件FIFO有溢出错误,就是说数据没有来得及读取而被覆盖了,提高驱动和上层接收应用程序的优先级还是会出现丢数据现象,理论上驱动和上层程序应该足够快去读取硬件FIFO呀?是不是WINCE读取COM口的方法有错?各位有什么建议,这个问题困扰了我很久了!!!
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于:2007-01-15 22:10
看了一下4.2 2440的串口驱动代码,建议你修改drivers/serial/ser2440_hw.c->SL_GetRxBufferSize()
return (0);把零值改成10240或以上。64K以下好了。
xiyulang
驱动牛犊
驱动牛犊
  • 注册日期2005-09-06
  • 最后登录2010-07-22
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望111点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-18 10:21
谢谢,zhengshijie兄。
我把drivers/serial/ser2440_hw.c->SL_GetRxBufferSize()  return (0);修改了,好像有改善,但还是会丢。后来发现有个奇怪的现象,如果在接收连续的数据时中往串口输出一些打印信息,接收数据就没有丢了,此时系统鼠标就动不了,必须等接收完数据才能操作,我想可能是在接收过程中发送的信息要等接收完成后才能发送,系统一直都在处理串口进程,没有跳到其他进程去,所以系统鼠标动不了,所以串口数据都接收到。这只是猜测,具体原因还没找到!大家有什么建议?
pinklizard
驱动牛犊
驱动牛犊
  • 注册日期2006-08-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-26 16:17
等待大牛解答,在此学习。
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-27 17:12
三星的系统我没有用过,不知道具体是怎么回事,
你认为是读取串口速度太低引起的,可以把从FIFO中读取数据的代码移到ISR中,
public\common\oak\drivers\serial\ISR16550目录下就是WINCE提供的ISR代码,可以看看能否适用于你的系统.
学海无涯
zhoumc
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2008-11-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望88点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-28 10:51
“往串口输出一些打印信息,接收数据就没有丢了”,是不是对方忙于接收串口中的数据,从而减少了发送数据?所以你这方接收到的数据减少,从而错误率下降。你可以再作个试验,在发送方每发送一个字节睡一毫秒,看错误率是否下降。如果有改善的话,可能还是你这边的接收速率太慢所致,解决的根本办法是增加流控机制来解决。也可通过适当减少发送方的数据发送速率来解决。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
6楼#
发布于:2007-02-06 13:19
事实上4.2 S3C2440 BSP默认是使能AFC(自动流控),可以看到s2440.h有定义:
#define USE_AFC                1
但是板子侧有流控,而发送方没有流控反而更会出问题,所以要么发送方使能流控,或把板子侧流控禁掉。还有就是系统的主频最好是400MHz或以上,SDRAM控制器的配置要优化,提高系统性能。
不要在中断中读取数据。
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-02-10 18:48
一楼的兄弟解决没有啊?我最近也在写串口的驱动,我觉得可能有这种可能:
你发送这么大的数据,在接收的同时是不是也在发送啊?如果是这样,可能需要平衡两者的CPU使用率,就是不要让发送或接收占用太多的时间.

而且你打调试信息能改善,从这个现象判断,有这两种可能:1.接收速度太快,CPU发现硬件已经有数据可以读取,但读取的时候硬件实际还没有准备好数据.
2.接收速度太慢,这可能是IST反应速度太慢所致.

可以用不同的速率测试一下,如果9600等低速时正常,高速时有错,应该是IST太快,反之应该是系统太慢. 但也可以查一下发送是否正常,而不只是关心接收.
也可以问一下三星,硬件是不是有什么问题,芯片有BUG也很正常.

仅供参考.
学海无涯
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-02 11:16
一楼的兄弟解决没有啊?
本人碰到和你一模一样的问题。
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-03-02 11:21
我在57600的波特率下,如果通过pc机向ce平台发送数据,WriteFile一次写10k字节,发现ce平台能够完整地接收到10k字节的数据;
如果在115200的波特率下,ce平台就不能完整地接收到10k字节的数据,有时丢的多,有时少。
lStoneCN
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望321点
  • 贡献值1点
  • 好评度28点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-13 20:23
发数据的时候丢包有没有遇到过?我这里是发数据丢。
寻zigbee/CC2430高手合作!
bluefish
驱动牛犊
驱动牛犊
  • 注册日期2007-09-15
  • 最后登录2011-05-30
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-03-11 11:16
各位老大们,我现在也遇到和楼主同样的问题,请教下各位是如何解决的?多谢
wbcp2000
驱动牛犊
驱动牛犊
  • 注册日期2005-05-11
  • 最后登录2011-02-27
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望9点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-08-15 22:15
我也到此问题,发送超出40个大小的字节,就有可能出现丢包现象。

我是写应用程序的,感觉需要优化驱动来解决问题。
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
13楼#
发布于:2008-08-15 22:52
你们方向都错了~

我的才设FIFO最低等级,
但传送接收数百MB 未见任何错误(115200-8-N-1)
(只使用RXD和TXD,没CTS和RTS线)

只要AP每次下令前把Buffer清掉,就搞定了
游客

返回顶部