Отсутствуют 0xF и 0x16, когда двоичные данные через пару виртуальных последовательных портов, созданные socat

Я использовал следующую команду, чтобы создать пару для последовательного порта и попытаться отправить через них двоичные данные.

sudo socat -d -d pty,link=/dev/tty.vcp0,raw,echo=0,user=myusername,group=staff pty,link=/dev/tty.vcp1,raw,echo=0,user=myusername,group=staff

Однако даже я пытаюсь отправить следующий двоичный файл

data.bin

0x16 0x16 0x16 0x16 0x16 0x16

(в основном просто файл с 6 байтами, каждый байт имеет значение 0x16)

by

cat /dev/tty.vcp0 > recv.bin

а также

cat data.bin > /dev/tty.vcp1

И я получаю всего 3 байта 0x16 вместо 6.

Аналогичная вещь происходит с байтом 0xF. Если я отправлю двоичный файл с 6 байтами 0xF, я не смогу получить ни одного байта.

Кто-нибудь знает, что вызывает отсутствие 0x16 и 0xF? Как передать двоичные данные, содержащие 0x16 и 0xF?

Другой тестовый пример:

Тестовый пример 1

Отправлять:

0x16 0x16 0x16 0x0 0x0 0x0 0x0 0x16 0x16 0x16

Получать:

0x16 0x0 0x0 0x0 0x0 0x16

Тестовый пример 2

Отправлять:

0xf 0xf 0xf 0x0 0x0 0x0 0x0 0xf 0xf 0xf

Получать:

0xf 0x0 0x0 0x0 0x0

Я добавил параметр -x в команду socat, и я вижу, что отображаются правильные данные, так что это должно быть проблемой принимающей стороны.

P.S. Все вышеперечисленные тесты проводятся на Mac OS X 10.9.2.


person jasonkit    schedule 18.04.2014    source источник
comment
Эта проблема вызывается флагом IEXTEN в файле termios.c_lflag. когда IEXTEN включен, VDISCARD=SI (0xF) и VLNEXT=SYN(0x16) не будут передаваться на вход, как указано на справочной странице termios. Самый простой способ решить эту проблему — передать iexten=0 команде socat, например: sudo socat -d -d pty, link=/dev/tty.vcp0,raw,echo=0,iexten=0,user=myusername,group=staff pty,link=/dev/tty.vcp1,raw,echo=0 ,iexten=0,пользователь=myusername,группа=персонал   -  person jasonkit    schedule 19.04.2014


Ответы (2)


Эта проблема вызывается флагом IEXTEN в файле termios.c_lflag.

Когда IEXTEN включен, VDISCARD=SI (0xF) и VLNEXT=SYN(0x16) не будут передаваться на вход, как указано на справочной странице termios.

Самый простой способ решить эту проблему — передать iexten=0 команде socat, например:

sudo socat -d -d pty,link=/dev/tty.vcp0,raw,echo=0,iexten=0,user=myusername,group=staff pty,link=/dev/tty.vcp1,raw,echo=0,iexten=0,user=myusername,group=staff
person jasonkit    schedule 19.04.2014
comment
Я так надеялся, что это решит мою проблему с последовательным-последовательным мостом socat, потребляющим управляющие последовательности uBlox (которые содержат символы 0x00), но, вздох, они все еще съедаются. Я использую: socat /dev/ttyO0,raw,echo=0,b115200,iexten=0 /dev/ttyO4,raw,echo=0,b57600,iexten=0 - person Robert Calhoun; 24.07.2015

Проблема здесь, скорее всего, связана с тем, как устройство очищает свои буферы. Функции cat просто открываются, записывают байты, затем закрывают устройство, не дожидаясь полного исчерпания данных.

В зависимости от того, какой тип устройства VCP вы используете, вы можете настроить поведение сброса таким образом, чтобы при закрытии устройства данные не сбрасывались, а просто выводились из приемопередатчика до тех пор, пока это не будет сделано.

В реальном приложении у вас был бы контроль над этим, и вы могли бы дождаться получения данных, прежде чем закрыть устройство.

Быстрое решение для этого случая — увеличить скорость передачи данных, чтобы данные покидали устройство достаточно быстро, чтобы в буфере ничего не было, когда устройство закрыто.

person Preston    schedule 18.04.2014
comment
Я не думаю, что это вызвано поведением сброса, и изменение скорости передачи данных не может решить эту проблему (по крайней мере, я пробовал другую скорость передачи от 9600 до 115200). Причина этого, если я отправил двоичные данные 0x16 0x16 0x16 0x0 0x0 0x0 0x0 0x16 0x16 0x16, я могу получить только 0x16 0x0 0x0 0x0 0x0 0x16. Ясно, что это только два последовательных 0x16 и результат одного 0x16, но я не уверен, что вызывает такое поведение. - person jasonkit; 18.04.2014
comment
Что ж, я бы порекомендовал написать для него настоящую программу, чтобы вы могли контролировать методы отправки/получения, а также свойства COM-порта. Если вам нужна помощь, может помочь эта ссылка на последовательное программирование POSIX. - person Preston; 18.04.2014
comment
Я написал простую последовательную задачу для отправки и получения двоичных данных и установил все те параметры termios, которые, как мне кажется, могут быть связаны, но результат тот же. Итак, чтобы упростить мышление, я просто задаю задачу, используя только команду cat - person jasonkit; 18.04.2014
comment
Я считаю Ellisys полезным инструментом для анализа передачи данных USB. - person Preston; 18.04.2014
comment
Возможно ли, что у вас есть эти настройки как символы управления потоком XON/XOFF или какая-либо другая последовательность escape-символов? - person Preston; 18.04.2014
comment
Спасибо, что поделились Ellisys, но я сейчас не работаю над реальным оборудованием (хотя позже я буду). Я столкнулся с этой проблемой на виртуальном последовательном порту (или это должен быть виртуальный терминал), созданном socat, и я ожидаю, что это проблема настройки socat, но, похоже, я не могу найти ничего полезного на справочной странице socat прямо сейчас ... - person jasonkit; 18.04.2014
comment
Для простой программы на C я отключил XON и XOFF или просто options.c_iflag &= ~(IXON | IXOFF | IXANY); На самом деле моя простая программа на C написана в соответствии с сайтом, которым вы поделились. Я не указал и не экранировал символ явно, могу ли я тогда предположить, что экранирование не является причиной? - person jasonkit; 18.04.2014
comment
Наконец, я обнаружил проблему, она вызвана тем, что IEXTEN включен в c_lflag termios, если я отключу его в своей программе C или передам -iexten=0 в socat, эта проблема исчезнет. аналогичную проблему с той же причиной можно найти здесь: forums.freebsd.org/viewtopic .php?f=35&t=44882 - person jasonkit; 19.04.2014