Скорее всего, я рассказываю вам много того, что вы уже знаете, но отладка таких ситуаций обычно требует полной картины.
Выпуск 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