Как считать данные с com порта. Serial Port Monitor Программное обеспечение для мониторинга COM-портов



Библиотека эта называется SerialGate.dll . Если Вы хотите использовать примеры этой и последующих статей, скачайте ее (библиотеку) и при желании ее исходники в предыдущей статье этого раздела.

В качестве "тренировочной базы" я решил рассмотреть решение довольно часто всречающейся задачи - передача данных между двумя компьютерами. Передавать данные, конечно же, будем через COM порт.

Как не покажется странным, начнем с "железа". Для того что бы передавать данные между двумя компьютерами, их необходимо соеденить специальным кабелем. Он называется "нуль-модемный" кабель для COM порта. Он продается под названием "Кабель нульмодемный DB9" в любом магазине радио-деталей. На обоих его концах установлен разъем COM порт - мама. Соедините порты двух компьютеров этим кабелем.

Разумеется, некоторая часть читателей задас вопрос - у меня нет двух компьютеров, как мне попробовать передачу данных по COM порту? В таком случае, для тестирования и проверки отлично подойдет следующий вариант - использовать два COM порта одного и тогоже компьютера. Т.е. посылать данные из программы в один порт, и считывать данные из другого, предварительно соеденив их нуль-модемным кабелем.


Возьмемся за программирование. Сначала напишем консольное приложение которое будет считывать символ с клавиатуры и посылаеть его в COM порт. Создаем, как обычно, в Microsoft Visual Studio консольное приложение и называем его, например, COMServer . К пустой заготовке необходимо подсоединить библиотеку SerialGate.dll. Последовательность действий при этом полностью аналогична работе с библиотекой inpout32.dll. Из скаченного архива помещаем файлы SerialGate.lib , SerialGate.h в папку проекта и SerialGate.dll в папку к исполняемой программе (Debug или Release). Далее, добавляем файл lib и h в самом проекте. Если все это делать лень, проект можно скачать готовым.

Вот собственно, и сам код программы. Рассмотрим, что в нем происходит. Сначала создается экземпляр класса SerialGate - sg. Далее, пытаемся открыть доспут к COM порту с помощью метода класса OpenPort(). Для этого, в функцию нужно передать номер COM порта (целое число). Т.е., например, если у Вас на компьютере установлен COM порт под названием COM3, и Вы хотите его открыть, Вам нужно передать первым параеметром в функцию число 3. Второй параметр - это скорость, на которой будет работать порт при передаче данных. Скорость для COM портов измеряется в битах в секунду и может принимать некоторое значение из определенного списка. По умолчанию, в Windows можно использовать следующие скорости:

110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000 и 256000 бит/сек.

Однако, многие виртуальные COM порты поддерживают гораздо более высокие скорости (до 1 МБ/c). В таком случае нужно использовать те скорости, работу на которых обеспечивает тот или иной сторонний порт. Скорости перечисленные выше однозначно работают для любых портов.

В представленном примере открывается порт "COM1" на скорости 57600 бит/c. Далее в "бесконечном цикле" с клавиатуры вводится символ и с помощью метода класса Send() отправляется в COM порт. Функции передаются два параметра: адрес на буфер, в котором находятся данные для отправки и вторым параметром - размер этих данных в байтах. Для завершения ввода достаточно ввести символ "#" - программа выйдет из цикла и используя метод Close() закроет порт.

#include #include #include "SerialGate.h" int main() { int port = 1; int bool res = sg.Open(port, rate); if (res == false return 0; } else { printf("Open OK!..\n"); } printf("Press key to send it to COM port.\n"); printf("Press "#" to exit.\n\n"); while (true ) { char c = getch(); printf("%c", c); sg.Send(&c, sizeof (c)); if (c == "#") break ; } sg.Close(); getch(); return 0; }

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

Итак, опять создаем экземпляр класса SerialGate и открываем порт "COM2" на скорости 57600 бит/с. Обращаю внимае, что для према/передачи данных оба порта, учавсвующих в обмене информацией, должны быть открыты на одной и той же скорости. Далее, в "бесконечном" цикле с интервалом в одну секунду считываем данные с COM порта с помощью метода Recv(). Ему необходимо передать два параметра: адрес на буфер, в который будут положены прочтенные данные и размер этого буфера во избежание выходов за пределы массива. Функция возвращает чило прочтенных байт. Затем прочтенные данные печатаются побайтно и если будет обнаружен символ "#" - значит COMServer закончил работу и этой программе нужно сделать то же самое.

#include #include #include "SerialGate.h" int main() { int port = 2; int rate = 57600; SerialGate sg; bool res = sg.Open(port, rate); if (res == false ) { printf("Open Error..\n"); getch(); return 0; } else { printf("Open OK!..\n"); } printf("Get data from COM port every 1 sec.\n\n"); char buf; int dwBytesRead = 0; bool terminate = false ; while (!terminate) { Sleep(1000); dwBytesRead = sg.Recv(buf, sizeof (buf)); for (int i = 0; i if(buf[i] == "#") { terminate = true ; break ; } } } sg.Close(); return 0; }

Настало время протестировать всю эту систему. Проверьте, соединили ли Вы порты кабелем. Компилируем и запускаем оба приложения. В программе COMServer набираем какой-либо текст с клавиатуры - с некоторой задержкой он должен появиться в окне программы COMClient.


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

© Иванов Дмитрий
Май 2007

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

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

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

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

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

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

// source: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() { long result; // Read temperature sensor against 1.1V reference ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH