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内核相关的问题.
你正在打开一个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.
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |