fc -l -5 # 5 most recent
fc -l 1 5 # 5 oldest
fc -l -10 -5 # 10th newest to 5 newest
Вы должны иметь возможность обнаруживать ошибки четности с правильными настройками 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-драйвера, но вы можете не увидеть никаких изменений в показаниях счетчиков.