Linux

Linux 和 Windows 之間的串列數據格式有區別嗎?

  • May 18, 2022

我正在嘗試使用此處找到的 RS-485 到 USB 轉換器和執行 Pyserial 的 python 腳本從 RS-485 RFID 閱讀器讀取串列數據。

我面臨的問題是,當我列印出讀取的內容時,執行 Ubuntu 18.04.6 LTS 的 Linux 上的 python 終端中會顯示正確數量但不正確的字節。但是,當我在 Windows 上測試它時,會顯示正確的字節。我使用完全相同的程式碼、相同的硬體(作業系統除外)和相同的閱讀器設置。

我的 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)。

注意:我知道字節 8 到 12(不從 0 開始計算)對應於我的標籤數據,因為在將 windows 十六進制值轉換為十進制後,該數字與我的標籤匹配,數據表也顯示。

那麼有人知道為什麼數據不同嗎?可能是因為系統以不同的方式查看/格式化或解釋數據?

謝謝您的幫助!

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

為了更方便的視覺參考,這裡再次顯示兩個字節流,但間隔和對齊:

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

於是又看了一遍,發現是驅動的問題。解決方案是更新或安裝 CH341 驅動程序的更新檔版本。

在此處找到說明。

我不完全明白出了什麼問題,但根據這裡的這篇文章,USB 到 RS485 轉換器的奇偶校驗可能存在問題。感謝所有的幫助!

注意:對於我的系統,第二個連結中的解決方案給出了錯誤並且不起作用。

引用自:https://unix.stackexchange.com/questions/701337