Вход

Регистрация
Главная
 

 

Пиротехнические пульты, пиротехническое оборудование
и пиротехника
Pyro Alex RF 48
Open Pyro SFX 8 D
Open Pyro SFX 10/120
Pyro Man 200 M
Spets 150
Приём заказов на изготовление пиротехнических пультов
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 1)
alexval2007Дата: Суббота, 12.12.2009, 11:01 | Сообщение # 1
Электро воспламенитель
Группа: Администраторы
Сообщений: 659
Награды: 7
Репутация: 7
Статус: Offline
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

 
  • Страница 1 из 1
  • 1
Поиск:


Rambler's Top100 Пиротехника, салюты, фейерверки. Яндекс цитирования
www.alexval2007.ucoz.ru © 2008