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