Вход

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

 

Пиротехнические пульты, пиротехническое оборудование
и пиротехника
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 порт. (Часть 2)
alexval2007Дата: Суббота, 12.12.2009, 16:41 | Сообщение # 1
Электро воспламенитель
Группа: Администраторы
Сообщений: 659
Награды: 7
Репутация: 7
Статус: Offline
SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 2). Программа под Windows.

Продолжаем программирование COM порта с помощью библиотеки SerialGate.dll На этот раз напишем программу для приема\передачи данных через COM порты под Windows в среде Microsoft Visaul Studio на MFC. Что она будет уметь делать: она сможет передавать данные и одновременно принимать их.

Вот и ее интерфейс. Как видно, можно задать номер порта и скорость на которой он будет работать. Затем нажимается кнопка "Open". Чтобы отправить данные в порт в соответствующем поле ввода необходимо набрать нужный текст и нажать кнопку "Send". В программе организован таймер, срабатывающий каждую секунду. При его срабатывании, происходит чтение информации из порта. Если они там есть, то данные помещаются в окошко ввода для этих данных.

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

Давайте приступим к коду программы. Весь готовый проект можно скачать готовым:

Скачать SerialGateTest.rar (размер: 62.6 КБ)

Давайте по порядку. Сначала посмотрим в файл "SerialGateTest.h". Здесь в описании класса можно увидеть объявление класса SerialGate sg.

class CSerialGateTestDlg : public CDialog
{
// Construction
public:
CSerialGateTestDlg(CWnd* pParent = NULL); // standard constructor

SerialGate sg;

Теперь рассмотрим обработчик на нажатие кнопки "Open". Сначала идет минимальная проверка на валидность введенных данных и если они в порядке с помощью метода класса SerialGate Open() пытаемся открыть указанный порт. Если открыть удалось, увидим сообщение об этом. Далее стартует таймер с идентификатором 1 и временем срабатывания 1000 мс. О нем поговорим позже.

void CSerialGateTestDlg::OnOpen()
{
// TODO: Add your control notification handler code here

UpdateData(true);

if(m_port == 0 || m_rate == 0)
{
MessageBox("Not correct data","Error", MB_ICONERROR);
return;;
}

bool b = sg.Open(m_port, m_rate);
if(b == false)
{
MessageBox("Can`t open Port","Error", MB_ICONERROR);
return;;
}
else
{
MessageBox("Port open OK","Info", MB_ICONINFORMATION);
}

SetTimer(1, 1000, NULL);
}

А вот и обработчик таймера. Пытаемся прочесть данные из порта с помощью функции Recv(). Если данные были прочтены (их число в байтах > 0) Помещаем прочтенную информацию в соответствующее окошко ввода.

void CSerialGateTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char buff[128];

int rcv = sg.Recv(buff, sizeof(buff));

if(rcv > 0)
{
for(int i = 0; i< rcv; i++)
this->m_recieve += buff[i];

UpdateData(false);
}

CDialog::OnTimer(nIDEvent);
}

Последняя функция нашего приложения. Обработчик на кнопку "Send". Проверяем, не нулевой ли длины сообщение которое хотим отправить. Если это не так, то получаем адрес на буфер строки запрятанной в MFC классе CString и обычный чаровский буфер с его длиной отправляем в функцию Send() которая все это дело запишет в COM порт.

void CSerialGateTestDlg::OnSend()
{
// TODO: Add your control notification handler code here

UpdateData(true);

int len = this->m_send.GetLength();
if(len > 0)
{
char* LocBuf = m_send.GetBuffer(128);
sg.Send(LocBuf, len);
m_send.ReleaseBuffer();
}

}

Проверяем программу в действии. Соединяем два порта кабелем и запускаем две копии этой программы. Открываем нужные порты и ведем переписку через COM порт.

© Иванов Д. В.
19 мая 2007 года
www.pcports.ru

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


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