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

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

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



§ 59. SerialGate.dll :: Чтение/запись данных в COM порт. (Часть 2). Программа под Windows

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

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

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


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

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


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

Давайте по порядку. Сначала посмотрим в файл "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 порт.



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



© KERNELCHIP 2006 - 2017