1

シリアルポートをエミュレートするUSB​​ポートを介してリモートデバイスにバイナリデータを書き込むためにLinuxアプリケーションを作成しました。&読み取りデバイスデータストリームからのフロー制御データ(0x13)がありません

デバイスからデータを読み取るとき、私はこのようなバイナリデータストリーム(0x01、0x0A ...... 0x13)を表示するUSB​​スニッファを持っていますが、私のプログラムがバイトを読み込んだとき、0x13はバイトストリーム - これはXOFF charですが、私はXON/XOFFフローコントロールを使用していません(私は思っています)。

バイナリモードではfreedとfwriteの両方を開いて読み書きしようとしましたが、同じ結果です。何か案は?

+0

はそれがシリアルオーバーUSBプロトコルが追加されますことを、チェックサムのバイト可能性があり、次のように、端末の属性が設定されていますか? –

答えて

0

制御文字がシリアルポート経由で送信されるのを避け、代わりにLinuxとリモートデバイスのアプリケーションを2バイトにエンコード/デコードするように少し修正する方がよいかもしれません。例えば、

0x00 0x00 -> 0x00 
0x00 0x01 -> 0x13 (escape XOFF) 
0x00 0x02 -> 0x11 (escape XON) 

これらの3バイトがバイナリストリームに現れる可能性を考慮すると、これは全体のスループットを低下させるものではありません。

ところで、XON/XOFFはソフトウェアフロー制御とシリアル/ターミナルドライバの基本機能です。実際にはこの機能はあなたの場合にも役立ちます - バッファのオーバーフローを避け、送信を一時停止(XOFF)または再開(XON)できる貴重なバイトがありません。

1

ウェブサイトのようなご回答ありがとうございます。

# stty -F /dev/ttyUSB0 

speed 115200 baud; 
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; 
lnext = ^V; flush = ^O; min = 0; time = 10; 
-brkint -imaxbel 
-opost 
-isig -icanon -echo -echoe 

それはオフ、 ソリューションは、すべての文字を見て何を無視しないようにcfmakeraw設定を使用することとしたフロー制御のように見えたにもかかわらず:sttyのはあったが判明。

cfmakeraw()は、古いバージョン7のターミナル・ドライバの "raw"モードのように端末を設定します。入力は文字単位で使用でき、エコーは無効になり、端末入出力文字の特殊な処理はすべて無効になります。

termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP 
      | INLCR | IGNCR | ICRNL | IXON); 
termios_p->c_oflag &= ~OPOST; 
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); 
termios_p->c_cflag &= ~(CSIZE | PARENB); 
termios_p->c_cflag |= CS8; 

すべての私のデータを参照できるようになりました:)

関連する問題