从不同的UART驱动程序中读取数据

时间:2016-07-18 11:56:18

标签: c serial-port linux-device-driver embedded-linux uart

由于不同的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字节。

  • 9600波特50字节需要52毫秒
  • 9600波特2048字节需要2.13秒
  • 9600波特4096字节需要4.26秒

因为我不知道答复的长度,所以我必须采取更糟糕的情况,并假设它可以是> 4096字节:

在我的旧系统中,我可以将端口配置为在ConfiguredTimeoutTime + 52毫秒时超时 在新版本中,我必须将其设置为ConfiguredTimeoutTime + 4260毫秒

ConfiguredTimeoutTime是一个宽限期,我让奴隶接收我的请求,处理它并创建一个响应。这取决于总线上的设备类型。

这是一个相当大的差异,这意味着每个无响应的从属设备在我的轮询时间内引入了近4秒的延迟。

问题是:

  • 我的代码中有什么可以做的,以获得类似于旧系统中的结果吗?
  • 在构建内核时,有什么我可以要求新系统的提供者进行更改吗?
  • 我完全忽视了这一点,并且在两个系统上都有更好的方法吗?

对于帖子的篇幅感到抱歉,我无法进一步了解它的浓缩方式! 谢谢!

1 个答案:

答案 0 :(得分:1)

尝试将读取超时设置为100毫秒,如下所示,以实现不同缓冲区大小的自由。当读取返回时,它将具有数据或不具有数据。

currentconfig.c_cc[VTIME] = 1;
currentconfig.c_cc[VMIN] = 0;

serial port library尝试一些简单的实验。 applications文件夹包含许多针对不同场景的读取方法设计。