SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 1). Итак, вот мы и добрались до рассмотрения вопросов приема - передачи данных через COM порт, вопроса, который, наверняка интересует многих. В этой и последующих статьях мы рассмотрим как можно передавать и принимать данные по COM порту. Для этого я написал небольшую динамическую библиотеку на основе класса, которой и сам постоянно пользуюсь, дабы в каждой программе не писать кучу рутинного API кода. Ведь класс - совсем другое дело. Один раз написал и пользуйся на здоровье.
Библиотека эта называется SerialGate.dll. Если Вы хотите использовать примеры этой и последующих статей, скачайте ее (библиотеку) здесь: СКАЧАТЬ SerialGate >>
В качестве "тренировочной базы" я решил рассмотреть решение довольно часто встречающейся задачи - передача данных между двумя компьютерами. Передавать данные, конечно же, будем через 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 в самом проекте. Если все это делать лень, проект можно скачать готовым:
Скачать COMServer.rar (размер: 88.8 КБ)
Вот собственно, и сам код программы. Рассмотрим, что в нем происходит. Сначала создается экземпляр класса 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 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("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©);
if(c == '#')
break;
}
sg.Close();
getch();
return 0;
}
Вот такое вот простенькое приложение для отправки данных. Теперь напишем вторую программу, которая будет открывать второй COM порт, соединенный с первым кабелем, и будет считывать оттуда данные. Готовый проект приложения COMClient можно скачать сдесь:
Скачать COMClient.rar (размер: 61.4 КБ)
Итак, опять создаем экземпляр класса 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[20];
int dwBytesRead = 0;
bool terminate = false;
while(!terminate)
{
Sleep(1000);
dwBytesRead = sg.Recv(buf, sizeof(buf));
for(int i = 0; i < dwBytesRead; i++)
{
printf("%c", buf[i]);
if(buf[i] == '#')
{
terminate = true;
break;
}
}
}
sg.Close();
return 0;
}
Настало время протестировать всю эту систему. Проверьте, соединили ли Вы порты кабелем. Компилируем и запускаем оба приложения. В программе COMServer набираем какой-либо текст с клавиатуры - с некоторой задержкой он должен появиться в окне программы COMClient.
Надеюсь, у Вас все получилось и библиотека SerialGate Вам понравилась. В следующих статьях мы напишем Windows приложение для приема/передачи данных и рассмотрим другие возможности библиотеки.
Иванов Д. В.
9 мая 2007 года
www.pcports.ru