由于不同的UART驱动程序行为将应用程序从旧的基于ARM的系统移植到新系统,因此出现问题。 这些是Linux嵌入式系统,一个是内核2.6.14的Atmel AT91,另一个是3.14.38的飞思卡尔iMX6。 我的申请是用c。
写的旧的似乎有10个接收缓冲区,每个50字节(我在内核源代码中看到了这个),而新的接收缓冲区似乎是4096中的至少1个(从测试中扣除)。
这意味着当我尝试从端口读取数据时,在旧系统中,我需要等待50倍的字符时间才能得到一些数据,而在新的系统上,我可能需要等待我得到任何数据之前有4096个字符的时间。 这是由于UART驱动程序中的DMA操作。驱动程序不会传递任何数据,直到缓冲区已满或已检测到传输结束。
如果我不知道每次都会得到一个响应(例如传输根据数据量采取所需的响应),这不会成为一个问题,但是当作为主人并与奴隶沟通时在公共汽车上,您可能会向不在的设备发出请求,因此您无法获得响应。在这种情况下,我的超时配置需要非常不同,旧系统可以更快地响应超时。
我将通过一个例子来说明这一点。 我有一个从端口读取的函数,直到没有更多的数据。 "读"阻止,直到有任何数据或超时时间过去。
如果传输是2048字节:
旧系统函数读取:50字节20次,然后48字节。 新系统函数读取:2048字节。
因为我不知道答复的长度,所以我必须采取更糟糕的情况,并假设它可以是> 4096字节:
在我的旧系统中,我可以将端口配置为在ConfiguredTimeoutTime
+ 52毫秒时超时
在新版本中,我必须将其设置为ConfiguredTimeoutTime
+ 4260毫秒
ConfiguredTimeoutTime
是一个宽限期,我让奴隶接收我的请求,处理它并创建一个响应。这取决于总线上的设备类型。
这是一个相当大的差异,这意味着每个无响应的从属设备在我的轮询时间内引入了近4秒的延迟。
问题是:
对于帖子的篇幅感到抱歉,我无法进一步了解它的浓缩方式! 谢谢!
答案 0 :(得分:1)
尝试将读取超时设置为100毫秒,如下所示,以实现不同缓冲区大小的自由。当读取返回时,它将具有数据或不具有数据。
currentconfig.c_cc[VTIME] = 1;
currentconfig.c_cc[VMIN] = 0;
从serial port library尝试一些简单的实验。 applications文件夹包含许多针对不同场景的读取方法设计。