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

StackOverflow https://stackoverflow.com/questions/3049

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Видишь: http://www.easysw.com /~майк/сериал/serial.html#3_1 (БОЛЬШЕ НЕ ДОСТУПЕН)

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

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

Другие советы

Если вы хотите писать код на Java, я действительно рекомендую SerialIOs Серийный порт.Он очень прост в использовании и экономит вам несколько рабочих дней.На самом деле я никогда не находил библиотеку с открытым исходным кодом, такую хорошую, как SerialIO!

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

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

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

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

Если это должно быть перекрестное подключение, я бы предложил посмотреть на Boost Asio.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top