阅读:5243回复:13
2440串口FIFO溢出问题
系统是远峰提供的S3C2440+WINCE4.2,通过2440的UART0接口数据,当数据量较大时(超过100K)出现丢失数据现象,通过在驱动中读取2440的UART0的出错状态寄存器,发现硬件FIFO有溢出错误,就是说数据没有来得及读取而被覆盖了,提高驱动和上层接收应用程序的优先级还是会出现丢数据现象,理论上驱动和上层程序应该足够快去读取硬件FIFO呀?是不是WINCE读取COM口的方法有错?各位有什么建议,这个问题困扰了我很久了!!!
|
|
沙发#
发布于:2007-01-15 22:10
看了一下4.2 2440的串口驱动代码,建议你修改drivers/serial/ser2440_hw.c->SL_GetRxBufferSize()
return (0);把零值改成10240或以上。64K以下好了。 |
|
板凳#
发布于:2007-01-18 10:21
谢谢,zhengshijie兄。
我把drivers/serial/ser2440_hw.c->SL_GetRxBufferSize() return (0);修改了,好像有改善,但还是会丢。后来发现有个奇怪的现象,如果在接收连续的数据时中往串口输出一些打印信息,接收数据就没有丢了,此时系统鼠标就动不了,必须等接收完数据才能操作,我想可能是在接收过程中发送的信息要等接收完成后才能发送,系统一直都在处理串口进程,没有跳到其他进程去,所以系统鼠标动不了,所以串口数据都接收到。这只是猜测,具体原因还没找到!大家有什么建议? |
|
地板#
发布于:2007-01-26 16:17
等待大牛解答,在此学习。
|
|
地下室#
发布于:2007-01-27 17:12
三星的系统我没有用过,不知道具体是怎么回事,
你认为是读取串口速度太低引起的,可以把从FIFO中读取数据的代码移到ISR中, public\common\oak\drivers\serial\ISR16550目录下就是WINCE提供的ISR代码,可以看看能否适用于你的系统. |
|
|
5楼#
发布于:2007-01-28 10:51
“往串口输出一些打印信息,接收数据就没有丢了”,是不是对方忙于接收串口中的数据,从而减少了发送数据?所以你这方接收到的数据减少,从而错误率下降。你可以再作个试验,在发送方每发送一个字节睡一毫秒,看错误率是否下降。如果有改善的话,可能还是你这边的接收速率太慢所致,解决的根本办法是增加流控机制来解决。也可通过适当减少发送方的数据发送速率来解决。
|
|
6楼#
发布于:2007-02-06 13:19
事实上4.2 S3C2440 BSP默认是使能AFC(自动流控),可以看到s2440.h有定义:
#define USE_AFC 1 但是板子侧有流控,而发送方没有流控反而更会出问题,所以要么发送方使能流控,或把板子侧流控禁掉。还有就是系统的主频最好是400MHz或以上,SDRAM控制器的配置要优化,提高系统性能。 不要在中断中读取数据。 |
|
7楼#
发布于:2007-02-10 18:48
一楼的兄弟解决没有啊?我最近也在写串口的驱动,我觉得可能有这种可能:
你发送这么大的数据,在接收的同时是不是也在发送啊?如果是这样,可能需要平衡两者的CPU使用率,就是不要让发送或接收占用太多的时间. 而且你打调试信息能改善,从这个现象判断,有这两种可能:1.接收速度太快,CPU发现硬件已经有数据可以读取,但读取的时候硬件实际还没有准备好数据. 2.接收速度太慢,这可能是IST反应速度太慢所致. 可以用不同的速率测试一下,如果9600等低速时正常,高速时有错,应该是IST太快,反之应该是系统太慢. 但也可以查一下发送是否正常,而不只是关心接收. 也可以问一下三星,硬件是不是有什么问题,芯片有BUG也很正常. 仅供参考. |
|
|
8楼#
发布于:2007-03-02 11:16
一楼的兄弟解决没有啊?
本人碰到和你一模一样的问题。 |
|
9楼#
发布于:2007-03-02 11:21
我在57600的波特率下,如果通过pc机向ce平台发送数据,WriteFile一次写10k字节,发现ce平台能够完整地接收到10k字节的数据;
如果在115200的波特率下,ce平台就不能完整地接收到10k字节的数据,有时丢的多,有时少。 |
|
10楼#
发布于:2007-03-13 20:23
发数据的时候丢包有没有遇到过?我这里是发数据丢。
|
|
|
11楼#
发布于:2008-03-11 11:16
各位老大们,我现在也遇到和楼主同样的问题,请教下各位是如何解决的?多谢
|
|
12楼#
发布于:2008-08-15 22:15
我也到此问题,发送超出40个大小的字节,就有可能出现丢包现象。
我是写应用程序的,感觉需要优化驱动来解决问题。 |
|
13楼#
发布于:2008-08-15 22:52
你们方向都错了~
我的才设FIFO最低等级, 但传送接收数百MB 未见任何错误(115200-8-N-1) (只使用RXD和TXD,没CTS和RTS线) 只要AP每次下令前把Buffer清掉,就搞定了 |
|