Windows UARTとLinux UARTの正しい構成の違い

Windows UARTとLinux UARTの正しい構成の違い

重要な問題: *nixのUART接続はWindowsのUART接続とどう違うのですか?正しいデータ転送と受信のためにどの設定を考慮する必要がありますか?

この質問をした背景: この質問は私の他の質問に関連しています。電気工学場所。デフォルトでは、Ubuntuラップトップとマイクロコントローラの間にシリアル(USB-RS-232)接続があり、最後の4ビットは正しく受信されますが、最初の4ビットは受信されません。 Windowsは8ビットをすべて受信します。考えられる問題は何ですか?何よりも私が興味を持っているのはWindows UARTとLinux UARTの違い

仕様:

main私が使用しているマイクロコントローラ(PIC 18F87J11)には非常に簡単なコードがあります。

  while (1) {
        while (!PIR1bits.RC1IF);  //Wait for a byte
        sprintf(txStr,"%.5X",RCREG);
        LCDWriteLine(txStr,0);

ここで重要なのは、バイトを受信して​​16進値をLCD画面に印刷することです。理論的には問題にはなりません。転送速度は9600で、パリティもなく、珍しいものもありません。 Windowsではputtyを使用し、Linuxではscreenを使用します。両方の設定は同じです。

ただし、Windowsでは受信した文字の16進値が0x61ですが、aLinuxでは0xE1最後の4ビットが正しく受信され、最初の4ビットは正しくありません。誰かがLinuxがビット7を設定した可能性があると指摘しましたが、これはチェックアウトされているようです。

$ echo "ibase=16;obase=2;E" | bc  
1110


$ echo "ibase=16;obase=2;6" | bc                                               
110

出力stty

$ stty -F /dev/ttyUSB0 -a                                                      
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

私の質問の中心に戻って:Windows UARTとLinux UART接続の違いは何ですか? 理論的には同じでなければなりませんが、そうではありません!動作するにはどの設定を変更する必要がありますか?

トラブルシューティングのテーマ別の性格:私がコメントとコメントで言ったように/開発者/チャット、質問は特定の質問をし、範囲内に維持されます。

  • 「*nixデスクトップまたはサーバーの使用または管理」
  • 「UNIX C APIとシステムインターフェース
  • Raspberry Piでもこれをテストしたので、「組み込みシステムのネイティブ* nix OS」のトピックに関連しています。

修正する

使用するとpython -c 'print("a")' > /dev/ttyUSB0動作します。ボードは文字に対応するバイトを受け取りますが、私が送信するものは何でも大文字と小文字を交互に表示します。たとえば、印刷はa0x61を受け取りますが、c0x43(ASCII値の大文字C)は受け取ります。また、入力を無視します。 0x61を印刷するaか、A常に呼び出します。

関連情報