7942|20

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于S3C2440串口的稳定收发问题 [复制链接]

关于S3C2440串口的稳定收发问题:

根据之前的eeworld的相关帖子,在串口驱动上设置了UCON和UFCON寄存器:
OUTREG(pHWHead,rUCON,0x3c5);   //Clock selection=PCLK, tx=level,rx=level,enable timeout int.
OUTREG(pHWHead,rUFCON,0x51);   //FIFO enable : tx-16bytes, rx-8bytes

同时CE系统用到是5.0,2440的BSP是从4.2升级上来的,
应用软件上的串口读写时间:
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts (m_hComm, &CommTimeOuts);
//读线程1ms超时--change by Rn//不管是否有数据要读取,ReadFile立刻返回
CommTimeOuts.ReadIntervalTimeout = 1; //change by Rn //MAXDWORD
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
CommTimeOuts.ReadTotalTimeoutConstant = 0;
//读超时=1000+(10*要写的字节数)
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;  
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
接收发送缓冲区为:
SetupComm(m_hComm,1024*1024,1024);        //In:1MByte;Out:1KByte


用在PC这边用串口调试助手向2440串口发送数据,然后2440用TCP服务(硬件使用DM9000网卡)直接转发回PC机。这个流程已经走通,问题就是串口不能稳定的接收数据,而且数据转发给网口的不影响串口的接收,问题就是不知道如何配置串口的参数。

通过实验,

串口一次发送1125字节的数据,不论是使用
OUTREG(pHWHead,rUFCON,0x61);   //FIFO enable : tx-16bytes, rx-16bytes
还是
OUTREG(pHWHead,rUFCON,0x51);   //FIFO enable : tx-16bytes, rx-8bytes
不论是在串口调试助手用手动点击发送还是使用500ms间隔自动发送,2440串口接收后直接转发回PC机的效果都比较好;

但是如果串口一次发送2250字节的数据,
不论是使用
OUTREG(pHWHead,rUFCON,0x61);   //FIFO enable : tx-16bytes, rx-16bytes
还是
OUTREG(pHWHead,rUFCON,0x51);   //FIFO enable : tx-16bytes, rx-8bytes
还是
OUTREG(pHWHead,rUFCON,0x41);   //FIFO enable : tx-16bytes, rx-1bytes
在串口调试助手用手动点击发送还是使用500ms间隔自动发送,2440串口接收后直接转发回PC机,都不能完整的接收到串口的数据;


现在就是困惑:像2440这样的arm芯片,串口能不能像PC上那样,可以很稳定的读写?



最新回复

你可以使用俺说到的方面去改进  详情 回复 发表于 2009-9-9 21:29
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对了,波特率是115200.
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
奇怪了,俺降低波特率为19200就可以接收完整阿(38400的没有试,估计也行),为啥?

是不是还是串口缓冲区的大小不足,记得有本书上说WinCE的
//分配串口设备缓冲区
SetupComm(m_hComm,512,512);
这条语句不推荐使用,CE系统会推荐一个合适的默认值

这个默认是不是和底层ARM芯片的BSP或是MDD层中的COM_INit函数有关(COM_INit函数有调用HWGetRxBufferSize(PDD代码)来获取PDD中设定的缓冲大小,并根据返回的具体值分配缓冲),那这个串口的接收缓冲区(区别于串口控制器硬件上的FIFO)该在那里设置呢?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
低波特率收发完整,说明读写速度跟不上。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
不知道把缓冲区调大能否解决
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
LZ 是否可试试将读 COMPort data 的 Thread 的 Priority 提高试试看.

Paul, Chao @ Techware
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
通过艰苦的调试,发现:
由于CE5.0默认设置的串口接收缓冲区大小是2048Byte[默认是2048Byte(RX_BUFFER_SIZE=2048Byte),见文件serpriv.h(D:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\SERIAL\COM_MDD2)],
所以在erpriv.h文件中修改为#define RX_BUFFER_SIZE 1024*1024

这样修改试试
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
现在改了,一口气接收4500Byte都没事。

 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
up
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
现在手动点击发送是没有问题,但是使用500ms左右的自动发送就会出现丢失数据的情况。

俺也自己估算了一下:对于115200的波特率,对于一秒钟可以发送14400Byte;
如果使用500ms间隔自动发送2250Byte(发送2250Byte需要大概208ms),2440收到串口来到数据后经过一些简单的处理(判断是否是特定格式的数据帧)然后用TCP服务转发到PC端,发送100次以后就会出现丢数据的现象,

S3C2440的串口FIFO是64位深度的,是不是2440的串口就是没有像台式机的串口那样功能强大?
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
台式的串口硬件FIFO参数,比如说FIFO深度阿,
那个可以讲讲。。。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
嘿嘿,这个和系统的性能也有关的,别的驱动也会影响的。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
像俺这样测试,PC端500ms自动接收2250Byte的数据到S3C2440串口,是不是很大流量了...

实际运用时不会这样子,但是JL就是非要这样测试...
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
现在像修改一下串口读写时间CommTimeOuts中的ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant参数,
资料上说:串口读写时间有两个种:
一个是ReadIntervalTimeout,这个值俺已经设置为1,即是接收时两字符间最大的时延为1ms;

一个是ReadTotalTimeoutConstant+ReadTotalTimeoutMultiplier×要读取的字符数,
那现在就纳闷这个“要读取的字符数”是怎么定义的呢?是人为设置还是在COMSTAT结构中cbInQue成员变量(该成员变量的值代表输入缓冲区的字节数),是哪一个?
 
 
 

回复

108

帖子

0

TA的资源

一粒金砂(中级)

15
 
关注此帖。

之前也做串口方面的通信。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
关注
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
俺今天下午测试了,应用程序中使用的是出口类,是封装的串口的有些函数,其中串口接受数据处理函数是定义成回调函数形式,在实际应用时还要发送个异步消息让自己编写的具体的串口数据处理函数去响应;

后来在该串口类中的串口事件线程中直接计数串口接收到的数据,并且不去出发串口接受数据函数(也就没有向自己编写的具体的串口数据处理函数发去异步消息),这样测试,发现稳定性大大的提高!!

 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 
我的SD卡掉数据不知道是不是这个问题
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 liuyan0120 的回复:
我的SD卡掉数据不知道是不是这个问题


哦?你把串口数据保存到SD中么?

俺这里也要把串口接收到的数据保存到SD中(SD卡上放置个EDB数据库)
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

20
 
在做串口收发数据实验 波特率115200  发现用100MS自动收发数据丢包厉害 知道怎么解决吗
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表