4

私はRS232から猫のファイルにデータを記録しようとしていました:

cat /dev/ttyS0 > rs232.log

その結果、最後の行を除いてすべてがファイルに含まれていました。

stdoutに出力することで、猫が改行文字('\ n')を取得した場合にのみ出力を書き込むことを発見できました。私は同じことを発見しました:

dd bs=1 if=/dev/ttyS0 of=rs232.log

読んだ後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);
    }
}

私自身のCコードの結果として、これはLinuxカーネル関連の問題のようです。

4

2 に答える 2

6

TTY を開いています。その TTY がクック (別名正規) モードの場合、行処理を実行します (たとえば、バックスペースはバッファーから前の文字を削除します)。行の終わりを待つのではなく、到着時にすべてのバイトを取得するために、TTY を raw モードにする必要があります。

ページから:_man

正規モードと非正規モード

c_lflag の ICANON canon フラグの設定によって、端末が標準モード (ICANON が設定されている) で動作しているか、非標準モード (ICANON が設定されていない) で動作しているかが決まります。デフォルトでは ICANON が設定されています。

正規モード:

  • 入力は行ごとに使用可能になります。行区切り文字の 1 つ (NL、EOL、EOL2、または行頭の EOF) を入力すると、入力行が使用可能になります。EOF の場合を除いて、行区切り文字は read(2) によって返されるバッファに含まれます。

  • 行編集が有効になっています (ERASE、KILL、および IEXTEN フラグが設定されている場合: WERASE、REPRINT、LNEXT)。read(2) は、最大で 1 行の入力を返します。read(2) が現在の入力行で使用できるバイトよりも少ないバイト数を要求した場合、要求されたバイト数だけが読み取られ、残りの文字は将来の read(2) で使用できるようになります。

非標準モードでは、入力はすぐに利用可能になり (ユーザーが行区切り文字を入力する必要はありません)、行編集は無効になります。

最も簡単なことは、 を呼び出すことcfmakerawです。

于 2012-10-03T15:28:53.250 に答える
0

これは機能しますか?

perl -e 'open(IN, "/dev/ttyS0") || die; while (sysread(IN, $c, 1)) { print "$c" }'

これは機能します:

$ echo -n ccc|perl -e 'while (sysread(STDIN, $c, 1)) { print "$c" } '
ccc$
于 2012-10-03T14:49:23.113 に答える