§ 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