Описание тега repair
Вы должны быть в состоянии обнаружить ошибки четности с правильными настройками termios, и даже пересчитать их, в зависимости от того какой драйвер обеспечивает. Функции ioctl TIOCGICOUNT
(см. человек 4 tty_ioctl) можно получить погрешность счетчиков, хотя это не документировано в MAN-странице. Функции ioctl не предусмотрено Python, но следующий скрипт getcounts.py
это через низкоуровневый вызов fcntl вызова, которые могут нуждаться в модификации для вашей системы. Он использует структуры, описанные в ядре серийный.ч
включаемого файла. (Примечание, счетчики на реальные серийные устройства могут также рассматриваться в файле/proc/телетайп/драйвер/серийный
, но не для USB-устройств).
#!/usr/Бен/вместо python2
# https://unix.stackexchange.com/a/525261/119298
импорт каталога sys флагов, массив
# ioctl для получения счетчиков. см. /usr/включать/Линукс/серийный.ч
# структура serial_icounter_struct{
# инт, карат, код, ГСЧ, ОКД, ГХ, ТХ, рамка, переполнения, четности, БРК
# buf_overrun, защищены[9]; }
деф getcounts(именем):
TIOCGICOUNT = 0x545D
ФД = открыть(имяфайла)
ы = массив.массив('я',[0 Для я в диапазоне(20)])
РЦ = вызов fcntl.функции ioctl(ФД.fileno(),TIOCGICOUNT,ы,правда)
если RC!=0:
печать "вертолет",радиоуправляемый
имена = "ТТ,ДСР,ГСЧ,ОКД,ГХ,ТХ,рамка,переполнения,четности,БРК,буфо"
ХТС,ДСР,ГСЧ,ОКД,ГХ,ТХ,рамка,переполнения,четности,БРК,буфо = с[:11]
для меня,имя в перечислить(имена.сплит(",")):
имя принт,с[я]
ФД.закрыть()
getcounts(Сыс.аргумент argv[1])
Например, 2 реальных последовательных портов подключен через кроссовер кабель следующими скрипт будет показывать 3 разных результатов, как мы меняем настройки определения четности. Начните с настройки обоих устройств с последовательным интерфейсом для того же, чтобы генерировать и определять четность (-ignpar
с -
за "не"). На попробуйте
функцией выполняется 3 раза писать Привет
На к ttys1
, а затем использовать ключам
, чтобы прочитать результат от ttyS0
, и, в конце концов getcounts.py
чтобы распечатать счетчики:
#!/бин/Баш
попробуйте()(
команда xxd-Л 16 к /dev/ttyS0 &
сон 1
я в 1 2 3 ; делать Эхо привет; сделали >/Дев/к ttys1
сон 1
getcounts.пы файл /dev/ttyS0
)
действовать до его закрытия -Ф с /dev/ttyS0 9600 сырые -Эхо помощью clocal
действовать до его закрытия -Ф /Дев/к ttys1 9600 сырые -Эхо помощью clocal
действовать до его закрытия -Ф с /dev/ttyS0 parenb -ignpar inpck parodd
действовать до его закрытия -Ф /Дев/к ttys1 parenb -ignpar inpck parodd
попробовать # должно быть ОК
действовать до его закрытия -Ф с /dev/ttyS0 -parodd
попробовать # должны сделать ошибки четности, много нулевых данных
действовать до его закрытия -Ф с /dev/ttyS0 parmrk
попробовать # должны получить четности ошибок, много ФФ 00 префикс для каждого данных
Первой попытке должны показать нам данные, поступающие через ОК, и паритет граф 0 (предполагая, что мы только начали пользоваться этими приборами):
00000000: 6865 6865 6865 6c6c 6f0a 6c6c 6f0a 6c6c привет.Здравствуйте.ад
...
четности 0
...
Перед следующей попытке, мы меняем даже паритета на ttyS0
и мы получаем на выходе
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
паритет 16
т. е. значение null char для каждого персонажа с плохой четности. Фактический подсчет четности ошибки 16, а то xxd
останавливается после прочтения 16 символов.
До финальной попытке, мы просим Марк четности ошибок в данных. Это делает ядра положите 2 байта 0xFF и 0x00 в передней части каждой плохой характер данных, и мы получаем:
00000000: ff00 68ff 0065 ff00 6cff 006c ff00 6fff ..ч..е..л..л..о.
паритет 22
Паритет рассчитывать только на 6, а то xxd
заканчивается еще раньше.
Данные, которые мы видели выше, должны быть одинаковыми для драйвер USB, но вы не можете получить никаких изменений в счетчиках.