Последовательный порт USB на Mac с использованием socat

У меня есть аппаратное обеспечение, которое подключено через кабель Prolific Serial к USB, и мне нужно использовать socat для отправки/получения трафика в/из этого и TCP-порта. На данный момент он установлен и отлично работает с minicom, используя:

minicom -D /dev/tty.usbserial -b 9600

Socat работает в одном направлении с TCP-портом, используя:

socat /dev/tty.usbserial,clocal=1,nonblock=1,cread=1,cs8,ixon=1,ixoff=1 TCP4:localhost:8080

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

Спасибо! Крис

Изменить: некоторый пример кода (который на самом деле не работает в двунаправленном режиме).

Chris-MacBookAir:~ chrisbridges$ socat -d -d - /dev/tty.usbserial,clocal=1,nonblock=1,cs8,ixon=1,ixoff=1,ispeed=9600,ospeed=9600,icanon=1
2013/01/09 13:13:34 socat[8501] N reading from and writing to stdio
2013/01/09 13:13:34 socat[8501] N opening character device "/dev/tty.usbserial" for reading and writing
2013/01/09 13:13:34 socat[8501] N starting data transfer loop with FDs [0,1] and [3,3]

person chris    schedule 09.01.2013    source источник


Ответы (2)


Спасибо за помощь. Теперь я решил это и могу нормально общаться. Socat действительно сложный инструмент. Вот мои окончательные настройки:

sudo socat -U -d -d -d /dev/tty.usbserial,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,raw,echo=0,crtscts=0 FILE:tnc-start.hex

Где «ixon» включает управление потоком XON/XOFF, «ixoff» включает отправку символов запуска/остановки, и, что довольно интересно, «echo» не выводит на консоль, а передает то, что передается обратно отправителю… странно!

person Chris Bridges    schedule 27.03.2013
comment
В чем разница между ispeed=9600,ospeed=9600 и просто b9600? Также я запустил stty --file на получившемся устройстве, и оно сообщило о нулевой скорости. Как странно? - person CMCDragonkai; 30.09.2016

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

Выпуск 1: классическая последовательная связь (чистый RS-232)

Из википедии для последовательного порта:

В вычислительной технике последовательный порт — это физический интерфейс последовательной связи, через который информация передается по одному биту за раз (в отличие от параллельного порта) (...) термин «последовательный порт» обычно обозначает оборудование, более или менее совместимое со стандартом RS-232, предназначенное для взаимодействия с модемом или с аналогичным устройством связи. (...)

Из википедии для RS-232:

В телекоммуникациях RS-232 — это традиционное название серии стандартов для последовательных двоичных несимметричных сигналов данных и сигналов управления, соединяющих между DTE (оконечное оборудование данных) и DCE (оконечное оборудование канала передачи данных) (...)

Итак, DTE — это ваш Mac, а DCE — это «железо». Для настройки последовательного соединения необходимо установить следующие параметры:

  • baudrate - максимальная скорость передачи данных, которая может быть достигнута
  • биты данных - это количество битов будет состоять из одного символа
  • стоповые биты - синхронизация потока
  • четность - проверка ошибок

Например. общими значениями для некоторых периферийных устройств POS являются 9600/8/1/none, но единственная существенная вещь заключается в том, что оба DCE и DTE должны иметь одинаковую > значения для этих параметров, чтобы они вели себя так, как задумано. Mac/ПК может использовать любое из предопределенных значений, поэтому вам нужно будет проверить руководство для вашего «железа», чтобы узнать, какие значения выбрать.

Если одно из этих двух устройств имеет большую скорость передачи, вы увидите мусорные данные на другой стороне. Кроме того, размер полученных мусорных данных будет меньше исходного размера отправленных данных. Если биты данных не установлены одинаково, вы должны также видеть ненужные данные, но того же размера. Я не уверен, что произойдет, если стоповые биты или четность не совпадают.

И самое главное - нужно знать протокол своей железки - возможно в деталях - чтобы она вел себя как задумано. Вообще говоря, связь RS-232 означает, что и DCE, и DTE обрабатывают некоторые данные, а затем отправляют некоторые данные по последовательному кабелю (двунаправленная связь).

Однако, хотя в настоящее время мы привыкли к многозадачности на стороне DTE, это может быть не так на стороне DCE. сторона - возможно, что ваша "железка" не может прослушивать свой последовательный порт во время обработки данных, и наоборот. Это означает, что если вы попытаетесь отправить ему какие-то данные, пока он занят обработкой других данных, он их не получит.

Поскольку RS-232 старше, чем многозадачность — учитывая, что когда они широко использовались, это было намного старше — правильным подходом было бы использование RS-232 механизмы синхронизации. Разобьем двунаправленную связь на два направления:

  • DTE (Mac) => DCE (часть hw): DTE активирует провод RTS (запрос на отправку) и ждет, пока DCE не активирует провод CTS (разрешение на отправку). Затем отправляет данные.

  • DCE (часть аппаратного обеспечения) => DTE (Mac): DCE активирует провод DSR (готовность набора данных) и ждет, пока DTE не активирует провод DTR (готовность терминала данных). Затем отправляет данные.

Судя по вашей настройке (minicom, socat), вы, вероятно, используете какой-то конвейер/перенаправление оболочки, поэтому я не знаю, как вы могли прочитать состояние проводов из оболочки (хотя это должно быть возможно). Для неспециалиста по архитектуре оболочки/ОС, как я, это действительно приятная проблема, но, к сожалению, у меня нет DCE, чтобы попробовать это :(

Используя программную библиотеку, такую ​​как простой последовательный коннектор Java, он становится так же тривиально, как чтение значения логической переменной.

Проблема 2: адаптированная последовательная связь (RS-232 на USB)

Я видел два (разных поставщиков)

Вывод

Как только байты достигнут TCP-порта, они будут переданы корректно. Поскольку socat — очень сложная программа, возможно, вы неправильно ее настроили. Повторяющиеся строки и символы указывают на это больше, чем на неправильную конфигурацию последовательного соединения. Но поскольку вы заявляете, что «аппаратное обеспечение» для TCP-порта работает, это также может означать, что данные, поступающие с TCP-порта, неправильно настроены.

Однако сначала вы должны убедиться, что знаете протокол для связи с вашей «железкой», поэтому я рекомендую попробовать сымитировать данные, поступающие с TCP-порта, и отправить их напрямую на последовательный порт. Например. напишите сценарий оболочки или программу с некоторыми основными командами, которая взаимодействует с вашим «железом» напрямую через последовательный порт. Если это окажется так, как предполагалось, вы знаете, что проблема либо в сокете, либо, что более вероятно, в данных, поступающих с порта TCP. Надеюсь у вас есть мануал на вашу "железку" :)

пожалуйста, обратная связь.

person linski    schedule 10.01.2013