О, сразу поставил dcb.fNull = false, эт правильно
Я когда-то с одним подлым программатором намучился, кажется это была филипсовская ISP-утилита для LPC2xxx. Берет и ставит этот бит в конфиге порта, и не снимает
. А я ленивый - сделал GetCommState, скорость да 8N1 выставил и общаюсь. И удивляюсь почему ни с того, ни с сего кто-то грызть пакеты начинает, некоторые байты не доходят... Потом уже наковырял что не доходят именно нулевые байты и почему это происходит. Короче после этого вызов GetCommState убрал, всю структуру заполнял сам и вызывал SetCommState.
Вообще прога была написана на скорую руку, куски на делфи, куски на сях, так что выкладывать ее тут наверное нету смысла (прога - мастер протокола ModBus-RTU, позволяет через переходник RS232-RS485 читать и писать регистры слейвов, хотя и не все). Ну и типа она моему бывшему работодателю принадлежит...
Да, а нафиг тебе GetCommConfig - вообще не понял, объявил бы DCB dcb; и работал с ним. Для примера все же выложу свою инициализацию:
- Код: Выделить всё • Развернуть
memset(&dcb, 0, sizeof(DCB));
dcb.DCBlength=sizeof(DCB);
dcb.fBinary=1;
// dcb.fParity=0;
// dcb.fOutxCtsFlow=0;
// dcb.fOutxDsrFlow=0;
dcb.fDtrControl = 0; // +power
// dcb.fDsrSensitivity=0;
// dcb.fTXContinueOnXoff=0;
// dcb.fOutX=0;
// dcb.fInX=0;
// dcb.fErrorChar=0;
dcb.fRtsControl = 1; // -power
// dcb.fNull=0;
// dcb.fAbortOnError=0;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=TWOSTOPBITS;
dcb.BaudRate=BaudRate;
if (!SetCommState(h,&dcb)) {
CloseHandle(h);
return FALSE;
}
+-power - это у нас схема опторазвязки переходника от этих ног питалась, поэтому такие нестандартные значения. Надо кажется обе единицы ставить.