char EofChar; // сигнал окончания потока char EvtChar; // зарезервировано WORD wReserved1; // зарезервировано } DCB;
Если неправильно указаны параметры, то данные не будут передаваться и приниматься. Самое главное — заполнить следующие поля:
Остальные параметры можно оставить по умолчанию (те, которые вернула система). Но прежде чем указывать какие-либо параметры, обязательно прочитайте документацию на аппаратуру, с которой необходимо соединяться. Я не встречал устройств, которые поддерживали бы все режимы работы. Например, модем ZyXel Omni 56 K может поддерживать скорость от 2400 до 56 000, и можно указывать значения только из этого диапазона.
Помимо этого, нужно, чтобы оба устройства (передающее и принимающее) были настроены одинаково (скорость, размер байта и т. д.), иначе данные не будут передаваться.
После конфигурирования порта запускается поток, в котором мы будем бесконечно пытаться считать данные из порта. Это, конечно же, не эффективно, потому что удобнее использовать сообщения Windows, но для простого примера в обучающих целях достаточно. Функция чтения потока ReadThread выглядит следующим образом:
DWORD __stdcall ReadThread(LPVOID hwnd) { DWORD iSize; char sReceivedChar; while(true) { ReadFile(hCom,&sReceivedChar,1,&iSize,0); SendDlgItemMessage((HWND)hwnd,IDC_EDIT2,WM_CHAR, sReceivedChar,0); } }
В этой функции вы можете увидеть бесконечный цикл чтения данных, которое выполняется стандартной функцией чтения из файла — ReadFile.
Теперь посмотрите на функцию закрытия порта, которая будет вызываться по нажатию кнопки Close port:
void CCOMportDlg::OnBnClickedButton1() { if (hCom == INVALID_HANDLE_VALUE) return;