Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 58. SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 1)

Иванов Дмитрий, Май 2007
Статья обновлена 27 Мая 2014

Файлы к статье скачать

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


Библиотека эта называется 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 <iostream>
#include <conio.h>
#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(c));

		if(c == '#')
			break;
	}

	sg.Close();

	getch();
	return 0;
}

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

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

#include <iostream>
#include <conio.h>
#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.


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



© Иванов Дмитрий
Май 2007
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017