linux - 如何更改 linux 串行线的读取缓冲区大小?

标签 linux serial-port buffer

初始问题和较早的讨论在这里:http://pastebin.com/GzsHhBs3

编辑/追加3:

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”)。 看起来在 6sec/retry*6 retries = 36 secs 之后,我仍然没有收到任何数据。

我会开始研究发送方代码,但我在这里移植的代码(从内核 2.4 嵌入式系统到内核 3.0.35 emb. 系统)曾经工作......所以它一定是什么东西在接收端。

最佳答案

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

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

但是,我会在这里指出,我们编写的 C++ 串行端口控件远离 .net 代码,同时适用于旧设备和新设备。

所以上面的代码应该可以在 linux 中从串口读取数据。

我想知道是否有 yocto 项目使用的边界设备 linux 内核 3.0.35 的串行端口驱动程序(我现在正在板上运行)。如果有人知道 sabrelite 的串口问题,请分享。谢谢!

关于linux - 如何更改 linux 串行线的读取缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454159/

相关文章:

c - Linux中限制进程读取 "/etc/resolv.conf"文件

python - PySerial:如何理解从串口读取时发生超时?

c++ - 使用 Windows API 操作 RS 端口

python - 如何连接 blob?

linux - Oracle 12c Ubuntu 17.04 安装报错

c++ - setsockopt 正在尝试将 IGMP 数据包发送到接口(interface)关闭

c - 多次读取被警报中断

C 切割 char 数组并从 socket 中保存二进制数据

java - 如何将 Java FloatBuffer(或任何 Buffer)保存到文件

java - 进程输出是否以 EOF 结尾,如果是,如何删除?