Как мне настроить последовательный порт и связаться с ним?

Мне нужно отправлять и получать данные по последовательным соединениям (RS-232 и RS-422).

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

В частности, я хочу сделать это на Java, C / C++ или одной из основных оболочек Unix, но у меня также есть интерес к последовательному программированию с использованием Windows / Hyperterminal.

Ответов (10)

Решение

Построить машину времени и вернуться в 1987 год? Хо-хо.

Хорошо, больше никаких язвительных комментариев.

Как мне определить, какие настройки конфигурации (например, скорость передачи) должны быть ...

Читали даташит? Хорошо-хорошо. Серьезно, последний. Если вам неизвестна скорость передачи данных устройства, с которым вы пытаетесь установить связь, у вас есть два варианта. Начни гадать или, возможно, выбей прицел. Если вам нужна хорошая отправная точка, позвольте предложить 9600-8-N-1. Я подозреваю, что вы можете добиться этого с помощью грубой силы относительно быстро. Есть третий вариант, когда есть олдскульный ниндзя, который может просто ПО ВИДУ искаженных символов при некоторой стандартной скорости передачи данных определить, какова фактическая скорость передачи данных. Конечно, впечатляющий трюк для вечеринки.

Надеюсь, у вас есть доступ к этой информации. В unix / linux вы можете использовать minicom для непосредственной игры с последовательным портом. Это должно позволить довольно быстро выяснить конфигурацию.

одна из основных оболочек Unix

В Unix последовательный порт (-ы) отображается / отображается в подкаталоге / dev /. ttyS0, например. Если вы установите правильную скорость передачи данных и еще много чего, используя minicom, вы даже можете добавить что-то в этот файл, чтобы отправить его туда.

Что касается сути вопроса, вы можете получить к нему доступ программно через заголовки POSIX. termios.h - самый большой.

См .: http://www.easysw.com/~mike/serial/serial.html#3_1 (БОЛЬШЕ НЕТ ДОСТУПНО)

но меня также интересует последовательное программирование с использованием Windows / Hyperterminal.

Hyperterminal и minicom - это, по сути, одна и та же программа. Что касается того, как Windows позволяет вам получить доступ к последовательному порту, я оставлю этот вопрос кому-нибудь другому. Я не делал этого в Windows со времен Win95.

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

Windows позволяет получить доступ к последовательному порту через CreateFile. Это дает вам ручку, и оттуда вы можете настроить доступ.

Если требуется кросс-платформенность, я бы посоветовал взглянуть на Boost Asio .

Некоторое время назад я написал приложение приличного размера для маршрутизации соединений с фермы модемов на сетевой адрес TCP / IP.

Сначала я искал свободную (бесплатную) библиотеку Serial IO. Я пробовал Sun, IBM и RxTx. Они подходили для разработки приложения и при первоначальном тестировании, но в производственной среде все они оказались нестабильными.

Наконец, я заплатил за SerialPort SerialIO. Преобразование было буквально упражнением по изменению импорта, а библиотека была абсолютно надежной - я не могу рекомендовать ее достаточно. Мое приложение работает круглосуточно без выходных в течение нескольких лет, и несколько клиентов не столкнулись ни с одной проблемой.

Если вы начнете разработку с использованием SerialPort, у них будет лучший API, и я бы его использовал.

Если вам нужна кроссплатформенная поддержка, лучшим выбором, который я смог найти, была Java с SerialPort.

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

Я использовал purejavacomm: это реализация javax.comm, написанная на чистом java + JNA.

В отличие от rxtx, вам не нужно устанавливать dll. Он написан на чистой Java + JNA, что решило для меня проблему переносимости между Windows и Linux. Должно быть легко переносить на другие ОС, поддерживаемые JNA, такие как Solaris и FreeBSD, но я не пробовал.

Вы можете ожидать, что чистая java-библиотека будет отставать от собственной реализации, такой как rxtx, по производительности, но с современными процессорами узким местом, скорее всего, будет битрейт вашего последовательного порта, а не циклы процессора. Кроме того, отладить намного проще, чем смешанную библиотеку Java / Native или чистый скомпилированный собственный код.

Если вы не обязаны использовать конкретный компилятор, я предлагаю использовать Qt, и в новой версии 5.3 вы найдете класс, посвященный последовательным портам:

http://qt-project.org/doc/qt-5/qserialport.html

Код, который вы напишете, будет работать на всех поддерживаемых платформах Qt, по крайней мере, на тех, которые имеют последовательные порты.

С другой стороны, если вы хотите сделать это с помощью C#, который будет работать как в Windows, так и в Linux - с некоторыми ограничениями (EDIT: который может быть устаревшим. У меня нет возможности проверить это.). Просто создайте объект SerialPort , установите его скорость передачи, порт и любые другие нечетные параметры, вызовите на нем open и запишите свои байты []. После всех настроек объект SerialPort действует очень похоже на любой сетевой поток, поэтому его должно быть достаточно легко понять.

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

Для C/C++ в Windows у вас есть (как минимум) два варианта:

  1. Используйте класс SerialPort, предоставляемый .NET.
  2. Используйте Win32 API. Существует обширная статья MSDN, датированная 1995 годом, и множество бесплатных библиотек и примеров в Интернете, которые помогут вам начать работу.

Вариант .NET будет намного проще.

Если вы хотите писать код на Java, я действительно рекомендую SerialIOs SerialPort . Он очень прост в использовании и экономит ваши дни работы. Я ДЕЙСТВИТЕЛЬНО никогда не находил такую ​​же хорошую библиотеку с открытым исходным кодом, как SerialIO!

Мой совет: не используйте фреймворк последовательного ввода-вывода Sun! Он с 1998 года и полон ошибок. Вы можете использовать rxtx, но лучше использовать serialio !

В зависимости от устройства, с которым вы пытаетесь установить связь, может быть больше параметров, чем скорость передачи, количество бит данных, тип проверки четности и количество стоповых битов, которые следует учитывать. Если я правильно помню, модемы используют девять линий интерфейса RS-232C. Некоторые устройства, например кассовые аппараты, могут использовать аппаратное подтверждение связи на линиях RTS / CTS или на линиях DTR / STR.

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