- Федоренко на связи
- Заметки на полях
- Проверка COM порта под linux
- 5 комментариев (and 38 trackbacks)
- Работа с последовательным портом на С в Linux
- Работа с последовательным портом в windows и linux
- работа с COM-портом
- Re: работа с COM-портом
- Re: работа с COM-портом
- Re: работа с COM-портом
- Re: работа с COM-портом
- Re: работа с COM-портом
- Re: работа с COM-портом
- Федоренко на связи
- Заметки на полях
- Работа с COM портом под Linux, используя сигналы Qt
Федоренко на связи
Заметки на полях
Проверка COM порта под linux
В этой заметке я расскажу про то, как можно проверить COM порт в Linux.
Для этого нам понадобятся:
- права на чтение и запись в COM порт
- программа minicom
- кусок толстого многожильного кабеля
Права доступа
проверяем какие у нас в системе есть COM порты, а также наши права на них:
/dev/ttyS0 это первый COM порт
/dev/ttyS1 соответственно второй COM порт
/dev/ttyUSB0 специальный кабель-переходник из USB в COM (Gembird UAS111)
Как мы видим для работы с COM портом необходимы права root либо пользователь должен входить в группу dialout
Провод для связи
Берём многожильный кабель в оплётке длиной 4-6 см, и соединяем 2 и 3 выводы COM порта перемычкой из этого кусочка провода. Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.
Для любителей паять можно предложить спаять полный loop-back тестер. В нём соединить не только контакты приёма передачи, но и аппаратный контроль потока и готовность терминала.
Работа с программой minicom
Для начала необходимо настроить программу minicom
Выбираем «Настройка последовательного порта»
Если нужно, меняем СОМ порт, нажимая «A»
Отключаем аппаратное управление потоком, нажимая «F»
Выходим из настроек «Enter»
Сохраняем настройки по умолчанию «Сохранить настройки как dfl»
Выходим из minicom
Собственно проверка СОМ порта
Запускаем minicom без параметров.
Пробуем нажимать на клавиши. В ответ на экране должны появляться символы.
Проверка COM порта под linux завершена.
Эта запись была сделана 21.12.2010, 13:50 под рубрикой Разное. Вы можете подписаться на эту запись с помощью RSS 2.0. Both comments and pings are currently closed.
5 комментариев (and 38 trackbacks)
#1 by Евгений on 02.05.2012 — 12:50
А как им управлять через PHP скрипт? Спасибо за статью!
Источник
Работа с последовательным портом на С в Linux
Я уже писал о том, как работать с последовательным портом в Windows. Теперь созрела необходимость написать программу для обмена данными по последовательному каналу.
Работать с последовательным портом в Linux несколько сложнее чем в Windows.
Как и с любым другим устройством работа из пространства пользователя Linux происходит посредством чтения и записи в файл. Его нужно открыть при помощи функции open, в качестве параметров передаем путь к файлу и флаги.
- O_RDWR — чтение и запись
- O_NONBLOCK — не блокировать файл
- O_NOCTTY — не делать устройство управлящим терминалом
- O_NDELAY — не использовать DCD линию
Функция возвращает идентификатор открытого файла или -1 в случае ошибки.
Если файл открыт успешно очистим флаги состояния файла вызовом fcntl.
Для управления настройками последовательного порта предусмотрен интерфейс termios. Заводим структуру типа termios.
Как видно она содержит флаги управления приемом/передачей.
Сбрасываем значения в 0.
Устанавливаем скорость обмена 9600 бод.
Далее необходимо настроить ряд флагов для указания операционной системе, что это не консольный терминал, а канал обмена «сырыми» данными.
После настройки порта же все просто, используем вызовы write/read для записи/чтения данных.
Для примера передадим Modbus команду чтения:
где 8 — длина буфера данных для отправки.
Далее необходимо считать ответ. Можно конечно же сразу написать вызов read. Но таким образом мы заблокируем программу до поступления желаемого количества данных, а ответа может и не быть! Чтобы избежать этого заведем структуру типа timeval и организуем вызов select.
Например так:
Источник
Работа с последовательным портом в windows и linux
Часто бывает необходимо, чтобы работа с устройством поддерживалась как в windows, так и в linux. В моем случае нужно было обеспечить работу com-порта в приложении, написанном на с/с++ с использованием кроссплатформенной библиотеки QT. Штатной поддержки программирования портов в QT нет (да и ни к чему это). Поэтому в win32 для работы с портом будем использовать средства WinAPI. В linux системах же, как известно для работы с устройствами используются специальные файлы.
Итак, взяв на вооружение всем знакомый gcc и его windows-аналог mingw, напишем нехитрый код.
Код будет довольно таки искусственным, т.к. ставится цель не более, чем показать принципы работы с com-портами в двух операционках. Для управления компилятором будем использовать директивы определения компилятора и ОС (__MINGW32__ и __linux). Com-портом в нашем случае является устройство dev/ttyS0 и COM1.
Инициализация
#ifdef __MINGW32__
HANDLE hSerial = CreateFile(«COM1»,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (hSerial == INVALID_HANDLE_VALUE) <
printf(«Error opening port\r\n»);
return -1;
>
#endif
#ifdef __linux
int fd = open(«/dev/ttyS0», O_RDWR | O_NOCTTY );
if (fd
Здесь в win32 используется функция CreateFile, параметры по ссылке в коде. Функция возвращает хендл на на устройство, в которым мы дальше будем работать. Аналогично работает и open в linux.
Запись
Для записи в порт используем ранее возвращенный хендл и пишем соответствующими функциями.
Процедура чтения выглядит аналогично.
Чтение
Закрытие порта
#ifdef __MINGW32__
CloseHandle(hSerial);
#endif
#ifdef __linux
close(fd);
#endif
Кроме того, существуют функции для настройки самих портов. Об их использовании я, возможно, напишу в следующих статьях. В нашем примере все работает по стандартным настройкам системы.
Осталось дело за малым — скомпилировать код под каждую из ОС.
Надеюсь, что эта практика пригодится кому-то, кроме меня самого.
Приятного си-программирования!
Источник
работа с COM-портом
Приветствую! Подскажите пожалуйста какие-нибудь готовые программы или утилиты для работы с com-портами (желательно в консольном режиме). От программы требуется задавать скорость обмена, возможность записи и чтения с порта. К примеру, я задаю скорость обмена, подаю какую-то информацию на ttyS0, который соединен null-модемным кабелем с ttyS1, и вижу полученную информацию в ttyS1
P.S. Решение проблемы стандартным методом cat /dev/ttyS0 и ls > /dev/ttyS1 просьба не предлагать)
Re: работа с COM-портом
Re: работа с COM-портом
Re: работа с COM-портом
а какие-нибудь менее масштабные? Загвоздка в том, что программа должна крутиться на CompactPCI с дистрибутивом linux, в котором имеется минимальный набор библиотек. Т.е. от прграммы ничего не требуется кроме как послать что-то на один ком-порт и принять с другого
Re: работа с COM-портом
> Т.е. от прграммы ничего не требуется кроме как послать что-то на один ком-порт и принять с другого
10 строк кода на Си.
Re: работа с COM-портом
к сожалению, в этой теме не силен, поэтому и ищу программу
Re: работа с COM-портом
> Т.е. от прграммы ничего не требуется кроме как послать что-то на один ком-порт и принять с другого
Кому надо писать этот нестандартный примитив, если оно уже есть в виде стандартных echo/cat/.
И почему вдруг «cat /dev/ttyS0 и ls > /dev/ttyS1 просьба не предлагать»?
Источник
Федоренко на связи
Заметки на полях
Работа с COM портом под Linux, используя сигналы Qt
Эта статья описывает один из вариантов работы с COM портом в асинхронном режиме.
Поскольку для QT я не нашёл подходящего мне инструментария, решено было написать свои классы работы с COM портом.
Предположим, что у нас есть некоторое устройство, которое может асинхронно передавать и принимать данные.
Функция NewData будет вызываться по приходу пакета новых данных из COM порта. MakeData — будет периодически вызываться у класа прибора для опроса новых данных. Если данные для отправки есть — функция возвращает true, и заполняет массив data данными для отправки.
Наследуя своё устройство MyDevice от класса Device, и описав свои функции NewData и MakeData можно сделать нечто подобное:
int main ( int argc, char * argv [ ] )
<
QCoreApplication a ( argc, argv ) ;
MyDevice dev ;
dev. CreatePort ( «/dev/ttyS0» ) ;
Устройство dev будет жить своей жизнью, используя два треда. В одном будут формироваться данные на отправку, а во втором будут приниматься и разбираться входные данные.
Особенностью реализации класса COM-порта в Linux является, организация чтения из порта по приходу сигнала SIGIO. Для этого создан класс-нотификатор, который преобразует сигналы ядра SIGIO в сигналы QT. Каждый COM-порт подключается к данному QT-сигналу и получает оповещения о приходе нового символа из COM порта.
В исходниках выложена непроверенная реализация COM-портов и для Windows.
Источник