Просмотреть ошибки четности последовательного порта?

zsh

fc -l -5      # 5 most recent 
fc -l 1 5     # 5 oldest 
fc -l -10 -5  # 10th newest to 5 newest
1
12.06.2019, 19:17
1 ответ

Вы должны иметь возможность обнаруживать ошибки четности с правильными настройками termios и даже подсчитывать их, в зависимости от того, что предоставляет драйвер. ioctlTIOCGICOUNT(см. man 4 tty _ioctl)может получать счетчики ошибок, хотя это не описано на странице руководства. ioctl не предоставляется Python, но следующий сценарий 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])

Например, с двумя реальными последовательными портами, подключенными перекрестным кабелем, следующий скрипт покажет 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

т. е. нулевой символ для каждого символа с плохой четностью. Фактическое количество ошибок четности равно 16, так как xxdостанавливается после чтения 16 символов.

Перед последней попыткой просим отметить ошибки четности в данных. Это заставляет ядро ​​помещать 2 байта 0xff и 0x00 перед каждым неверным символом данных, и мы получаем:

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

Счетчик четности увеличивается только на 6, так как xxdзавершается еще раньше.

Приведенные выше данные должны быть одинаковыми для USB-драйвера, но вы можете не увидеть никаких изменений в показаниях счетчиков.

2
28.01.2020, 00:10

Теги

Похожие вопросы