在Linux上记录RS232而无需等待换行

FSM*_*axB 4 linux logging serial-port

我试图将数据从RS232记录到带有cat的文件中:

cat /dev/ttyS0 > rs232.log
Run Code Online (Sandbox Code Playgroud)

结果是除了最后一行之外,我的文件中包含了所有内容.

通过打印到stdout,我能够发现,只有在获得换行符('\n')时,cat才会写入输出.我发现了同样的:

dd bs=1 if=/dev/ttyS0 of=rs232.log
Run Code Online (Sandbox Code Playgroud)

阅读后如何不等待Perl换行的情况下立即打印文本?我开始想,如果这可能是Linux-Kernel或coreutils包的缓冲问题.

根据TJD的评论,我用C编写了我自己的程序,但仍然遇到了同样的问题:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* args[])
{
    char buffer;
    FILE* serial;
    serial = fopen(args[1],"r");
    while(1)
    {
        buffer = fgetc(serial);
        printf("%c",buffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

截至我自己的C代码的结果,这似乎是一个Linux内核相关的问题.

Ben*_*igt 6

你正在打开一个TTY.当该TTY处于cooked(aka canonical)模式时,它执行行处理(例如,退格从缓冲区中删除前一个字符).您需要将TTY置于原始模式,以便在到达时获取每个字节而不是等待行结束.

man页面:

规范和非规范模式

c_lflag中ICANON canon标志的设置确定终端是以规范模式(ICANON设置)还是非规范模式(ICANON未设置)运行.默认情况下,ICANON设置.

在规范模式中:

  • 输入逐行提供.键入其中一个行分隔符(NL,EOL,EOL2;或行开头的EOF)时,输入行可用.除EOF外,行分隔符包含在read(2)返回的缓冲区中.

  • 行编辑已启用(ERASE,KILL;如果设置了IEXTEN标志:WERASE,REPRINT,LNEXT).read(2)最多返回一行输入; 如果read(2)请求的字节数少于当前输入行中可用的字节数,则只读取所请求的字节数,其余字符将可用于将来的读取(2).

在非规范模式下,输入立即可用(用户不必键入行分隔符),并禁用行编辑.

最简单的事情就是打电话cfmakeraw.

  • 感谢您的提示,运行“stty -F /dev/ttyS0 raw”后一切正常 (2认同)