LinuxとWindowsの間でシリアルデータ型に違いはありますか?

LinuxとWindowsの間でシリアルデータ型に違いはありますか?

私が見つけたRS-485-USBコンバーターを使ってRS-485 RFIDリーダーからシリアルデータを読み込もうとしています。ここそしてPyserialを実行するPythonスクリプトです。

私が直面している問題は、読んだ内容を印刷するときにUbuntu 18.04.6 LTSを実行しているLinuxのPython端末に正しい数ですが、間違ったバイトが表示されることです。ただし、Windowsでテストすると正しいバイトが表示されます。私はまったく同じコード、同じハードウェア(OSを除く)、同じカードリーダー設定を使用しています。

私のWindowsコード:

import serial
import time

ser = serial.Serial('COM6', 19200, timeout = 2, parity = serial.PARITY_EVEN)
time.sleep(2)

while True:
    while(ser.in_waiting > 0):
        x = (ser.readline().hex())
        print(x)
        

ウィンドウ出力:

020308fe10807c000bcbae9b9e

私のLinuxコード:

import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 19200, timeout = 2, parity = serial.PARITY_EVEN)
time.sleep(2)

while True:
    while(ser.in_waiting > 0):
        x = (ser.readline().hex())
        print(x)

Linux出力:

0203081e1a001c030b0b1d131e

したがって、どちらの場合も、13バイト(バイトあたり2桁)を取得して文字列に変換します。私が興味を持って100%知っておくべき唯一のデータはRFIDタグデータです。これはバイト8からバイト12(Windows出力の場合は000bcbae9b)です。ただし、Linux出力のデータは異なります(030b0b1d13)。

注:Windowsの16進値を10進数に変換した後、数値が私のタグと一致し、データシートに表示されるため、バイト8〜12(0から計算しない)が私のタグデータに対応することがわかります。

それでは、なぜデータが異なるのかを知っている人はいますか?システムがデータを別の方法で表示したり、フォーマットしたり解釈したりする可能性がありますか?

助けてくれてありがとう!

stty -F /dev/ttyUSB0 -aの出力

onecup@inventory03:~$ stty -F /dev/ttyUSB0 -a
speed 19200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 0; time = 0;
parenb -parodd -cmspar 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 -flusho -extproc

視覚的に参照しやすくするために間隔をあけて、並べ替えられた2バイトストリームを再表示します。

Byte nr:  1  2  3  4  5  6  7  8  9 10 11 12 13
Windows: 02 03 08 fe 10 80 7c 00 0b cb ae 9b 9e
Linux:   02 03 08 1e 1a 00 1c 03 0b 0b 1d 13 1e

さらなる参照のために、以下は様々なRFIDタグの出力です。 (バイト8〜12はまだ私が興味を持っている唯一のバイトです。Windowsは正確でLinuxは間違っています):

Byte nr:  1  2  3  4  5  6  7  8  9 10 11 12 13
Windows: 02 03 08 fe 2e 80 7c 00 0b bb 9a 80 4b
Linux:   02 03 08 1e 16 00 1c 03 0b 17 1a 01 09

ベストアンサー1

何度も検索した結果、ドライバの問題であることが確認されました。解決策は、CH341ドライバのパッチバージョンを更新またはインストールすることです。

指示を探すここ

私は何が間違っているかを完全に理解していませんが、この記事によるとここ、USB-RS485コンバータのパリティに問題がある可能性があります。ご協力ありがとうございます!

注:私のシステムでは、2番目のリンクのソリューションでエラーが発生し、機能しません。

おすすめ記事