Linux 和 Windows 之间的串行数据格式有区别吗?

Linux 和 Windows 之间的串行数据格式有区别吗?

我正在尝试使用找到的 RS-485 到 USB 转换器从 RS-485 RFID 读取器读取串行数据这里和运行 Pyserial 的 python 脚本。

我面临的问题是,当我打印出读取的内容时,运行 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

答案1

经过多方查找,发现是驱动的问题。解决方案是更新或安装 CH341 驱动程序的修补版本。

找到说明这里

我不完全明白出了什么问题,但根据这篇文章这里,USB 至 RS485 转换器的奇偶校验可能存在问题。感谢您的帮助!

注意:对于我的系统,第二个链接中的解决方案出现错误并且不起作用。

相关内容