如何更改linux串口线的读缓冲区大小?

时间:2013-07-03 17:08:58

标签: linux serial-port buffer

初始问题和旧讨论:http://pastebin.com/GzsHhBs3

修改/ append3:

VTIME似乎运作正常:

打开串口时,我设置

serial_opts.c_cc[VTIME]=60; //6 seconds

然后代码为:http://pastebin.com/W0vPGDBm

我已经实现了超时的时间测量,并尝试从串口重新读取(),直到满足MAX_RETRIES(= 5)。

超时似乎正常,调试输出是(显示最后2个read()操作,以及读取的字节):

SERIAL: DATA read 11 bytes and a total of 12262 .
SERIAL: serDataBuf[12262]=   0x32
SERIAL: serDataBuf[12263]=   0x30
SERIAL: serDataBuf[12264]=   0x32
SERIAL: serDataBuf[12265]=   0x30
SERIAL: serDataBuf[12266]=   0x32
SERIAL: serDataBuf[12267]=   0x30
SERIAL: serDataBuf[12268]=   0x32
SERIAL: serDataBuf[12269]=   0x30
SERIAL: serDataBuf[12270]=   0x32
SERIAL: serDataBuf[12271]=   0x30
SERIAL: serDataBuf[12272]=   0x32
SERIAL: DATA read 5 bytes and a total of 12273 .
SERIAL: serDataBuf[12273]=   0x30
SERIAL: serDataBuf[12274]=   0x32
SERIAL: serDataBuf[12275]=   0x30
SERIAL: serDataBuf[12276]=   0x32
SERIAL: serDataBuf[12277]=   0x30
SERIAL: time diff is tv_sec=5 , tv_usec=996447
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 0.
SERIAL: time diff is tv_sec=5 , tv_usec=999983
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 1.
SERIAL: time diff is tv_sec=5 , tv_usec=999973
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 2.
SERIAL: time diff is tv_sec=5 , tv_usec=999961
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 3.
SERIAL: time diff is tv_sec=5 , tv_usec=999974
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 4.
SERIAL: time diff is tv_sec=5 , tv_usec=999960
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 5.
SERIAL: time diff is tv_sec=5 , tv_usec=999982
SERIAL: No DATA have been read. Timeout @ byte 12278, timeout counter 6.

请注意,最后一个字节接收是一个有效的ascii字符(0x30,对应于一个字符'0')。 它看起来像6秒/重试* 6重试= 36秒后,我仍然没有收到任何数据。

我会开始研究发送方的代码,但是我在这里移植的代码(从内核2.4嵌入式系统到内核3.0.35 emb。系统)以前工作.....所以它必须是某种东西在接收方。

1 个答案:

答案 0 :(得分:1)

在我办公室的绝望尝试中,我们修改了主机应用程序(在Windows上运行,在MS Visual Studio上构建,作为.net应用程序)。所以我们创建了一个小型C ++串口控制应用程序来绕过.net和瞧!在不改变嵌入式系统端代码的情况下,我现在可以读取我期望的完整数据(来自嵌入式设备端)!

我不会责怪.net,因为在我将嵌入式系统的代码从较旧的设备ARM9TDMI-ARMv4T(运行带有内核2.4的Linux)移植到较新的freescale cortex A9 imx6q sabrelite后问题开始显现。

但是,我会在这里注意到,远离.net代码,我们编写的C ++串口控件既可以使用旧设备,也可以使用旧设备。

所以上面的代码应该适用于从linux中的串口读取。

我想知道yocto项目使用的boundary-devices linux内核3.0.35的串口驱动程序是否存在某些东西(我现在正在板上运行)。如果有人对sabrelite的串口问题一无所知,请分享一下。谢谢!