Чтобы постоянно опрашивать модем на предмет поступления новых символов надо открыть дополнительный поток с бесконечным циклом. //Прототип функции дополнительного потока. UINT TerminalThread(LPVOID arg);
DWORD dwCount; DCB dcb; HANDLE hCommPort; DWORD Errors; COMSTAT pComStat; COMMTIMEOUTS CommTimeouts;
UINT TerminalThread(LPVOID arg) { //Открытие порта hCommPort = CreateFile(options.Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
//Получаем настройки порта GetCommState(hCommPort, &dcb);
//Меняем часть настроек на свои dcb.BaudRate = 9600;//Скорости в бодах dcb.ByteSize = 8; //Байты информации dcb.Parity = NOPARITY;//Четность dcb.StopBits = ONESTOPBIT; //Кол-во стоп. битов
//Устанавливаем новые настройки SetCommState(hCommPort, &dcb);
/* Установка таймаутов. Служит, чтобы программа не висла в ожидании ответа от модема */ GetCommTimeouts(hCommPort,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout = 50; CommTimeouts.ReadTotalTimeoutMultiplier = 1; CommTimeouts.ReadTotalTimeoutConstant = 50; CommTimeouts.WriteTotalTimeoutMultiplier = 1; CommTimeouts.WriteTotalTimeoutConstant = 50;
SetCommTimeouts(hCommPort,&CommTimeouts);
//Очистка буфера (На всякий случай) FlushFileBuffers(hCommPort);
//Цикл опроса модема for (;;) { //Опрос модема ReadFile(hCommPort, &ch, 1, &dwCount, NULL); if(ch) //Проверка на наличие символа { //Вывод поступившего символа Функция_форматированного_вывода_символа(&ch,1); }; ch = 0; } return 0; }
Класс ввода/вывода HCSVIEW Ниже приведенный класс предназначен для форматированного ввода/вывода. По интерфейсу класс максимально близок к средствам ввода/вывода под Dos. Т.е. вам придется только задать окно и текст, который надо вывести в этом окне, все остальное класс берет на себя. Текст, который не помещается в окне будет автоматически перенесен на следующую строку. Также класс понимает символы возврата каретки и перехода на следующую строку. Чтобы осуществить прокрутку в окне, надо всего лишь перенаправить данные получаемые по сообщению ON_WM_SCROLL соответствующей функции класса. Класс HCSView:class HCSView : public CWnd { char ch; TEXTMETRIC Font; RECT WinPos; char Buf[10000]; int MaxX,MaxY,x,y,ScrollRange,ScrollPos; int Bufi; CClientDC *dcCompPtr; CBrush membrush; CBitmap VirtWin; CWnd *WinPtr; CDC memdc; int FullLineSize; public:
//Функция прокрутки. void HSScroll(UINT SBCode, UINT Pos, CScrollBar *SB);
//Установить шрифт. NewFont - новый шрифт. void HSSetFont(LOGFONT NewFont);
//Установить цвет текста. void HSSetTextColor(COLORREF TextColor);
/* Функция вывода текста. Заносит данные в буфер И вызывает функцию HFillVirtWin. *str - указатель на строку. l - длинна строки. */ void HSTextOut(char *str, int l);
/* Функция перерисовки виртуального окна. Выводит данные и буфера в виртуальное окно. Имеет смысл вызывать при изменении размеров окна. При получении сообщения ON_WM_SIZE Функцию нужно вызывать без аргументов: HFillVirtWin(); */ void HFillVirtWin(int csr = 1,int nw = 1,int bp = 0);
/* Функция копирования виртуального окна в реальное. Нужно вызывать при каждом сообщении WM_ON_PAINT */ void HSCopyVtR();
//Конструктор класса. HCSView(CWnd *SWinPtr); };
Пример работы с классом/* Пример части программы выводящий символы, поступающие с клавиатуры, на экран. MainWin - объект класса (CMainWin) окна в которое будет выводится текст. */
HCSView View(&MainWin);
//Вывод символа на экран afx_msg void CMainWin::OnChar(UINT ch, UINT count, UINT flag) { View.HSTextOut(&c,1); }
//Прокрутка afx_msg void CMainWin::OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB) { View.HSScroll(SBCode,Pos,SB); }
//Перерисовка окна afx_msg void CMainWin::OnPaint() { View.HSCopyVtR(); }
//Форматирования текста, //при изменении размеров окна. afx_msg void CMainWin::OnSize(UINT nType, int cx, int cy) { View.HFillVirtWin(); } |