Программа для чтения данных с ком порта

Урок посвящен интерфейсу RS-232, который в простонародье называют COM-порт. Мы разберемся как он представлен в Linux, какой у него интерфейс, научимся его конфигурировать, а также узнаем, что написание программы для коммуникации через COM-порт в Linux не представляет сложности.

Разговор o коммуникации через COM-порт в Linux следует начать с того, что заметить, что каждому COM-порту в операционной системе соответствует файл устройства телетайп или tty. Он находится в каталоге dev и имеет имя /dev/ttyS и номер. Если посмотреть на мой каталог, то мы увидим следующее, что у меня таких файлов очень много [0:55]. Но по факту, в моем компьютере есть один физический COM-порт.

Давайте попробуем его найти. Сделать это можно с помощью команды dmesg, которая выводит сообщения с момента инициализации системы. Если набрать $dmeg | grep «ttyS»

то мы увидим, что, в действительности , у меня только один файл ttyS4 связанный с конкретным COM-портом, у которого есть некоторый диапазон ввода/вывода, номер прерывания, и который сейчас настроен на скорость обмена 150200 бит в секунду (или бод). Для того, чтобы сконфигурировать мой COM-порт по умолчанию в Linux можно воспользоваться программой mincom, запускать её нужно от суперпользователя, либо добавить текущего пользователя в группу dialout. Запустим $sudo minicom -s

💬 Как передавать и принимать данные из Arduino в компьютер и обратно? Очень просто!

Ключ -s – обозначает конфигурацию (setup), Здесь мы видим следующее [2:24]. Есть параметры последовательного порта, важно прописать правильно файл, то есть указать тот файл, который у вас в системе связан с физическим COM-портом, Второй важный момент – это настройка параметров обмена (ключ Е).

Дело в том, что корректный обмен данными по последовательному соединению возможен только тогда, когда обе стороны имеют один и тот же набор параметров. В этом окне можно набор этих параметров менять [3:08]. Мы видим, что у нас задана скорость 8 бит, нет контроля четности, и один стоповый бит.

Именно здесь можно это все увидеть и настроить так, как требуется или, как требует ваше устройство. Сохраняем конфигурацию по умолчанию. Дальше будем взаимодействовать — сначала с помощью команды терминала, чтобы проверить, как вручную это работает; а потом напишем небольшую программу, которая будет слать данные в COM-порт. Выйти из Mincom можно набрав ctrl-A-X.

Для того чтобы проверить, как работает COM-порт можно воспользоваться программой miniterm [4:03]. Я создал виртуальную машину с обычным linux, у неё указал, что в наличии имеется один COM-порт (это COM1), по умолчанию назначились линии обработки запросов прерывания. Я ассоциировал этот COM-порт с файлом на моей host-машине. С этого файла мы будем читать данные записанные в порт.

Итак, мы видим, что в левой части экрана у нас есть логин на виртуальную машину [4:46]. Давайте проверим с помощью minicom -s, как настроены коммуникации. Проверим, что /dev/ttyS0 – это действительно правильный физический порт – да, это именно так. Теперь мы можем вызвать команду $sudo miniterm она говорит, что есть следующие доступные порты, и просит ввести, через какой порт работать.

Уроки Arduino #2 — работа с монитором COM порта

Далее я попадаю терминал, связанный с COM-портом, где могу набирать текст. Набирая команды, я вижу «эхо» в моем файле справа. Обратите внимание, что я пишу в левом окне, а на экране надпись мы видим в правом. В левом окошке – виртуальная машина, на которой настроен порт. В правом – тот лог, который мы видим в файле ассоциированном с этим COM-портом на host-машине.

Создадим какой-нибудь каталог, в котором будем разрабатывать приложение. Как это ни странно, приложение будет выглядеть очень просто, потому что все действия, которые мы делаем с COM-портом в linux, это действия с файлами с использованием тех же самых файловых операций.

Нам потребуется stdio.h, unistd.h, чтобы получить доступ – функциям open/read/write, fcntl.h, чтобы иметь возможность использовать файловые флажки. Открываем файловый дескриптор, COM-порт, имя, и флаги из COM-порта. Проверим, что файловый дескриптор у нас открылся, то есть если порт меньше или равен 0, то есть какая-то ошибка, оповестим об этом пользователя и вернем управление.

В противном случае, можно писать в этот файловый дескриптор. write принимает файловый дескриптор, указатель на буфер, размер. Дальше мы закрываем файловый дескриптор и возвращаем управление. Приложение готово. Теперь давайте попробуем запустить то, что у нас вышло, вернее, скомпилировать и запустить [10:40].

При запуске приложения произошла ошибка, но она вызвана понятными причинами, потому что пользователь должен был быть включен группу dialout [11:03], или нам надо запускать приложение от суперпользователя. Сделаем это. И сразу видим, что в нашем окошке появилась запись «hello world». Можно повторить и увидеть, что все работает корректно. Точно таким же образом можно осуществлять чтение из COM-порта, то есть использовать не функцию write, а функцию read. Источник

Заметки о Linux, электронике, радиолюбительстве

Личный блог Вадима Кузнецова, RA3XDH

Читайте также:
Как создать бухгалтерскую программу

воскресенье, 27 июля 2014 г.

Работа с последовательным портом из консоли Linux

В предыдущем посте было показано как запустить UART на отладочной плате Launchpad для MSP430. Теперь рассмотрим как общаться с платой при помощи средств командной строки Linux. Используется плата с прошивкой из предыдущего поста.

Для подробностей — см. под кат Как известно, все устройства последовательных портов представлены файлами устройств в каталоге /dev.Через эти файлы и происходит общение ОС Linux с внешним устройством на последовательном порту. Чтобы передать что-то на внешнее устройство нужно записать данные в файл устройства, а чтобы считать информацию из устройства — прочитать данные из файла устройства. Это можно делать при помощи команд cat и echo так же как для обычных файлов на диске. Или внутри программы на С при помощи вызовов ioctl(), read() и write() или библиотеки termios.

Физическим последовательным портам RS232, к которым подключались диалапные модемы на старых компьютерах, соответствуют файлы устройств /dev/ttyS*, начиная с /dev/ttyS0. Виртуальным последовательным портам, которые создаются различными конвертерами USB UART соответствуют файлы устройств /dev/ttyUSB* и /dev/ttyACM*.

Ядро Linux автоматически разпознаёт подключенное устройство, загружает для него драйвер и создаёт файл устройства. Вручную устанавливать драйвер, как в ОС Windows не требуется. Например, если подключить к USB преобразователь USB UART FT232, то создаётся файл устройства /dev/ttyUSB0, с которым можно работать также как и с обычным последовательным портом.

На плате Launcpad находится микросхема TUSB3410, которая тоже представляет собой конвертер USB UART. Если подключить её к USB, то создаётся файл устройства /dev/ttyACM0. Чтобы общаться с платой нужно что-либо писать/читать с этого файла. Чтобы пользователь мог читать или писать в файл устройства последовательного порта, его нужно добавить в группу dialout.

Иначе работать с последовательным портом сможет только администратор root. Простейшим приложением с графическим интерфейсом, которое работает с последовательным портом, является CuteCOM. Он обычно уже есть в вашем дистрибутиве Linux. Его можно установить из репозиториев. При помощи CuteCOM мы работали с платой в предыдущем посте. Выглядит CuteCOM вот так: Работать с ним крайне просто.

Указываем нужное устройство, если его нет в списке, то его можно впечатать вручную. Затем указываем скорость и параметры и нажимаем OpenDevice. В окне видим данные, которые пришли от устройства. В поле ввода в нижней части можем печать строку символов, которые предаются на устройство. Чтобы передать данный нажимаем Enter и смотрим ответ устройства в окне.

Теперь рассмотрим как работать с COM-портом из командной строки. Для этого служат три команды: stty, cat и echo. Команда stty устанавливает параметры и скорость COM-порта. Её формат:

stty -F

Чтобы установить параметры для платы Launchpad для соединения на скорости 9600 нужно выполнить: $ stty 9600 -F /dev/ttyACM0 raw -echo

Параметр raw устанавливает, что данные в компьютер передаются байт за байтом так же как приходят в порт без преобразований. Аппаратное управление потоком отключено. Подробнее о том, что включает и выключает raw — см. man stty. Если не включить raw, то скорее всего ничего работать не будет. Теперь в той же консоли нужно набрать $ cat /dev/ttyACM0

И можно смотреть данные, которые приходят от платы. Выход — нажать Ctrl+C. Теперь нажимаем на плате RESET и видим, что в консоди напечатался текст. Чтобы передать в плату данные, в другой консоли нужно использовать команду echo и перенаправление вывода в файл устройства. Наберём в другой консоли: $ echo «1»>/dev/ttyACM0

Видим, что на плате загорелся красный светодиод и в первой консоли было выдано сообщение об этом. Чтобы убрать конец строки в передаваемых данных, то нужно использовать запуск echo -n, а чтобы интерпретировать 16-ричные коды — нужно echo -e. Ключи можно комбинировать.

В итоге должно получиться так: Чтобы увидеть 16-ричные коды данных, приходящих от устройства, нужно использовать команду hexdump: $ cat /dev/ttyACM0|hexdump -C

Получится вот так: Чтобы иметь вывод данных от устройство на экран и в текстовый файл нужно использовать tee: Источник

Работа с последовательным портом на С в 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.
Например так:

Читайте также:
Лучшая программа для окон

Источник: onecomp.ru

Программа чтения данных с com порта. Перенаправление данных из COM-порта в Web

Вот мы и добрались до COM порта. Но с ним все не так просто как с LPT, и его полноценное использование потребует значительно больших усилий. Главной загвоздкой является и его главное преимущество — передача данных в последовательном виде.

Если в LPT байт данных передается по 8-ми линиям по биту на каждую, и состояние каждой линии можно было легко посмотреть, то в COM порту байт данных передается бит за битом по одной линии (относительно земли, конечно) и посмотреть что там передается с помощью одних светодиодов не удастся. Для этого нужно специальное устройство — преобразователь потока последовательных данных в парраллельный, т.н. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Например, он есть в составе материнской платы компьютера, снабженного COM портом, в любом более мение серьезном микроконтроллере.

Надеюсь, вы еще пали духом в освоении COM порта. Все не так уж и мрачно. Некоторые результаты можно получить и без USART. Сформулируем задачу, которую реализуем на начальном этапе работы с COM портом:

«Хочу что бы к компьютеру через COM порт подключался светодиод. Запускаю программу. Далаю какое-то действие в этой программе, светодиод загорается, делаю другое — светодиод тухнет.»

Задача довольно специфичная (с учетом того, что USART не используется) и является чистой «самопальщиной», но вполне реализуема и работоспособна. Давайте приступим к ее реализации.

Опять берем системный блок вашего ПК и смотрим в тыловую часть. Примечаем там 9-ти штырьковй разъем — это и есть COM порт. Реально их может быть неколько (до 4-х). На моем ПК установлено два COM порта (см. фото).

2. Удлинитель COM порта

3. Аппаратная часть

С аппаратной частью нам тоже придется «повозиться», в том смысле что она будет сложнее чем с первым устройством для LPT порта. Дело в том что протокол RS-232 по которому идет обмен данными в COM порту, имеет несколько отличное соотношение логическое состояние — напряжение. Если обычно это логический 0 0 В, логическая 1 +5 В, то в RS-232 это соотношение следующее: логический 0 +12 В, логическая 1 -12 В.

И например, получив -12 В не сразу понятно что с этим напряжением делать. Обычно проводят преобразование уровней RS-232 в ТТЛ (0, 5 В). Самый простой вариант — стабилитроны. Но я предлагаю сделать этот преобразователь на специальной микросхеме. Называется она MAX232.

Теперь давайте посмотрим, а какие сигналы из COM порта мы можем посмотреть на светодиодах? В действительности, в COM порту есть аж 6 независимых линий, представляющих интерес для разработчика устройств сопряжения. Две из них пока для нас недоступны — линии по передаче последовательных данных. А вот оставшиеся 4 предназначены для управления и индикации процесса передачи данных и мы сможем «передалать» их под свои нужды. Две из них предназначены для управления со стороны внешнего устройства и мы их пока трогать не будем, а вот последние две оставшиеся линии мы сейчас и поиспользуем. Они называются:

  • RTS — Запрос на передачу. Линия взаимодействия, которая показывает, что компьютер готов к приему данных.
  • DTR — Компьютер готов. Линия взаимодействия, которая показывает, что компьютер включен и готов к связи.

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

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

А вот ее практичекая реализация. Я думаю вы меня простите, что я сделал ее в таком стремном макетном варианте, ибо делать плату для такой «высоко продуктивной» схемы не хочется.

4. Программная часть

Тут все попроще. Давайте создадим Windows приложение в Microsoft Visual C++ 6.0 на основе MFC для управления двумя линиями взаимодействия COM порта. Для этого создаем новый проект MFC и указываем ему имя, например, TestCOM . Далее выбираем вариант построения на основе диалога.

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

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

HFile = CreateFile(«COM2», GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) < MessageBox(«Не удалось открыть порт!», «Ошибка», MB_ICONERROR); >else

С помощью стандарной функции Win API CreateFile() открываем COM-порт COM2 . Далее проверяем успешность открытия с выводом информационного сообщения. Вот тут надо сделать важное замечание: COM2 — это в моем компьютере, а на Вашем компьютере Вы могли подключить его к другому COM порту. Соответственно, его имя нужно изменить на то, кокай порт Вы используете. Посмотреть, какие номера портов присутствуют на Вашем компьютере, можно так: Пуск -> Настройка -> Панель управления -> Система -> Оборудование -> Диспетчер устройств -> Порты (COM и LPT) .

Читайте также:
Необходимо написать программу которая выведет является ли данный год високосным или обычным

В итоге, функция CTestCOMDlg::OnInitDialog() , расположенная в файле TestCOMDlg.cpp , класса нашего диалога должна принять вид:

BOOL CTestCOMDlg::OnInitDialog() < CDialog::OnInitDialog(); // Add «About. » menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); > > // Set the icon for this dialog. The framework does this automatically // when the application»s main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here hFile = CreateFile(«COM2», GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) < MessageBox(«Не удалось открыть порт!», «Оштбка», MB_ICONERROR); >else < MessageBox(«Порт успешно открыт», «Ok», MB_OK); >return TRUE; // return TRUE unless you set the focus to a control >

Теперь добавим обработчики кнопок управления линиями. Я дал им соответствующие имена: функция, которая устанавливает еденицу на линии DTR — OnDTR1(), 0 — OnDTR0(). Для линии RTS соответственно аналогичным образом. Напомню, что обработчик создается при двойном щелчке на кнопке. В итоге, эти четыре функции должны принять вид:

Поясню немного как они работают. Как видно, внитри себя они содержат вызов одной и той же Win API функции EscapeCommFunction() с двумя параметрами. Первый из них — это хэндл (HANDLE) на открытый порт, второй — специальный код действия, соответствующий необходимому состоянию линии.

Все, комилируем, запускаем. Если все хорошо, должны увидеть сообщение об успешном открытии порта. Далее, нажатием соответствующих кнопок мигаем светодиодами, подключенными к COM порту.

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

В комментариях к статье было высказано сожаление о том, что такое решение не заработает под Firefox-ом и высказана идея, что «можно еще написать простенький веб-сервер с выдачей html на основе этой штуки». Меня эта идея «зацепила», быстрый поиск в google готового решения не выдал, и я решил реализовать идею сам. И вот, что из этого вышло.

Предупреждение! Предлагаемое решение ни в коем случае нельзя рассматривать как законченное. В отличие от Serial Projector от Амперки — это концепт, демонстрация возможного подхода, работающий прототип и не более того.

Некоторое время назад я делал проект, в котором использовал встроенные в Android-смартфон акселерометры для управления сервами, подключёнными к Arduino. Тогда для этих целей я воспользовался проектами Scripting Layer for Android (SL4A) и RemoteSensors . Оказывается, в стандартную библиотеку python-а входит пакет BaseHTTPServer , с помощью которого поднять веб-сервис на питоне — это задача на пару строчек кода.

Под рукой не было никаких датчиков для Arduino, поэтому в качестве источника отображаемой информации я воспользовался встроенным в Arduino Uno внутренним термометром. Насколько я понимаю, он не очень точный и совсем не предназначен для измерения температуры окружающей среды, но для прототипирования вполне сойдёт.

После недолгого гугления возник вот такой скетч для ардуинки:

Источник: olacom.ru

Программа для чтения данных с ком порта

Уважаемые пользователи nowa.cc и 2baksa.ws . У нас сложилось тяжёлое финансовое положение. Мы работаем для вас вот уже более 15 лет и сейчас вынуждены просить о помощи. Окажите посильную поддержку проектам. Мы очень надеемся на вас. Реквизиты для переводов ниже.

WMZ: 826074280762 WME: 804621616710

E-mail для связи по вопросу помощи

4100117770549562

Неактивный пользователь
Регистрация: 18.02.2007
Сообщений: 11
Репутация: 1
Перехват данных из Com-порта

Всем доброго времени суток!
Подскажите вопрос.
Есть девайсина подлюченная на ком-порт и прога работающая с этой девайсиной. Очень необходимо внедриться между ними и прозрачно перехватить все данные которыми они обмениваются.
Открыть порт для чтения записи получается, но при этом прога ругается, что он «захвачен».
Подскажите кто чем сможет!
Реализация желательна на Дельфере, но в принципе — язык не принципиален

__________________
Не говорите, что мне нужно делать и я не скажу куда вам нужно идти
Последний раз редактировалось Obscure; 18.04.2008 в 19:37 ..

Здесь может быть Ваша реклама

Здесь может быть Ваша реклама

Реклама: кухонный стол недорого купить деревянный стул в москве кресло начальника речной теплоход по саратову gp1-3n гальванический раствор золочения для карандаша

Неактивный пользователь
Регистрация: 04.05.2007
Сообщений: 5
Репутация:
Ответ: Перехват данных из Com-порта
Пишешь «девайс», который будет у тебя как COM-порт. и работаешь прогой уже через него
Пользователь
Регистрация: 21.09.2006
Сообщений: 103
Репутация: 22
Ответ: Перехват данных из Com-порта
Драйвер нужен
Тут товарищ подсказывает, что у winternals какой-то драйверосниффер был. Не уверен.
__________________
Beeep! Pshshshsh! Tape loading error.
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 3
Репутация:
Ответ: Перехват данных из Com-порта

Eсть такая прога portmon http://technet.microsoft.com/en-us/s. /bb896644.aspx
Раньше качал ее с http://www.sysinternals.com/
Вроде бы там были и исходники.
Сечас этот адрес переадресовывает на страницу с майкрософта, купили их там что ли. Однако остался форум http://forum.sysinternals.com/

Открывать порт ест-но смысла нет. Обычной программой этот перехват не организовать. Тут надо либо как портмон на уровне драйверов, либо можно попробовать запустить прогу из под своей и перехватить некоторые апишные функции.
Прога случайно не досовская?

Есть еще другой способ, в некотором роде даже более простой, но для этого понадобится дополнительно 2 компорта.
Принцип следующий:
прога ->com1->кабель->ком2->прога перехватчик->ком3->девайс

Источник: nowa.cc

>>

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru