查看串行端口奇偶校验错误?

查看串行端口奇偶校验错误?

我有一台设备正在尝试进行一些测试。我知道它以 115200 的波特率连接,有 8 个数据位,无奇偶校验和 1 个停止位。

我试图证明这些设置,或者至少接近证明这些设置实际上是设备正在使用的设置。设备在启动时发送已知数据,因此测试策略是在正确的设置下连接以接收数据,然后改变单个设置并预期损坏的数据。

但是,当我直接使用 pyserial 或 termios 改变奇偶校验或停止位设置时,我没有看到损坏的数据。只有 6 位数据大小的变化才会损坏数据。

是否有任何位置或日志可以记录奇偶校验或停止位错误等问题?是否有一些使用 termios 的设置可以调整以记录奇偶校验或停止位的错误?

更多数据:实际串行流量通过 USB-COM422-PLUS4 板中的 FT4232H 进行,因此我要测试的黑匣子显示为 /dev/ttyUSB3

答案1

您应该能够使用正确的 termios 设置检测奇偶校验错误,甚至对它们进行计数,具体取决于驱动程序提供的内容。 ioctl TIOCGICOUNT(参见男人4 tty_ioctl)可以检索错误计数器,尽管手册页中没有记录这一点。 Python 不提供 ioctl,但以下脚本getcounts.py通过低级 fcntl 调用来完成此操作,可能需要针对您的系统进行修改。它使用内核包含文件中描述的结构serial.h。 (注意,真实串行设备的计数器也可以在 中看到/proc/tty/driver/serial,但 USB 设备则看不到)。

#!/usr/bin/python2
# https://unix.stackexchange.com/a/525261/119298
import sys, fcntl, array
# ioctl to get counters. see /usr/include/linux/serial.h
# struct serial_icounter_struct{
#  int cts, dsr, rng, dcd, rx, tx, frame, overrun, parity, brk,
#      buf_overrun, reserved[9]; }
def getcounts(filename):
    TIOCGICOUNT = 0x545D
    fd = open(filename)
    s = array.array('I',[0 for i in range(20)])
    rc = fcntl.ioctl(fd.fileno(),TIOCGICOUNT,s,True)
    if rc!=0:
        print "rc",rc
    names = "cts,dsr,rng,dcd,rx,tx,frame,overrun,parity,brk,bufo"
    cts,dsr,rng,dcd,rx,tx,frame,overrun,parity,brk,bufo = s[:11]
    for i,name in enumerate(names.split(",")):
        print name,s[i]
    fd.close()

getcounts(sys.argv[1])

例如,通过交叉电缆连接 2 个真实串行端口,当我们更改奇偶校验检测设置时,以下脚本将显示 3 个不同的结果。首先将两个串行设备设置为相同,以生成和检测偶校验(-ignpar-“不”表示)。该try函数运行 3 次以hello在 上写入ttyS1,然后用于xxd从 读取结果ttyS0,最后运行getcounts.py以打印计数器:

#!/bin/bash
try()(
    xxd -l 16 /dev/ttyS0 &
    sleep 1
    for i in 1 2 3 ; do echo hello; done >/dev/ttyS1
    sleep 1
    getcounts.py /dev/ttyS0
)

stty -F /dev/ttyS0 9600 raw -echo clocal
stty -F /dev/ttyS1 9600 raw -echo clocal
stty -F /dev/ttyS0 parenb -ignpar inpck parodd
stty -F /dev/ttyS1 parenb -ignpar inpck parodd
try # should be ok
stty -F /dev/ttyS0 -parodd
try # should get parity errors, lots of null data
stty -F /dev/ttyS0 parmrk
try # should get parity errors, lots of ff 00 prefix to each data

第一次尝试应该向我们显示数据正常,奇偶校验计数为 0(假设我们刚刚开始使用这些设备):

00000000: 6865 6c6c 6f0a 6865 6c6c 6f0a 6865 6c6c  hello.hello.hell
...
parity 0
...

在下一次尝试之前,我们将其更改为偶校验ttyS0并获得输出

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
parity 16

即每个奇偶校验错误的字符都有一个空字符。xxd读取 16 个字符后停止,奇偶校验错误的实际计数为 16 。

在最后一次尝试之前,我们要求标记数据中的奇偶校验错误。这使得内核在每个坏数据字符前面放置 2 个字节 0xff 和 0x00,我们得到:

00000000: ff00 68ff 0065 ff00 6cff 006c ff00 6fff  ..h..e..l..l..o.
parity 22

奇偶校验计数仅增加 6,因为xxd终止时间甚至更早。

对于 USB 驱动程序,上面看到的数据应该是相同的,但计数器可能不会发生任何变化。

相关内容