Здравствуйте, Alexei_z_, Вы писали:
A__>Функция открытия порта:
A__>A__>int SerialPort::OpenPort(unsigned port)// Opens COM port with number "port"
A__> {
A__> char pcPort [5];
A__> sprintf(pcPort,"%s%i","COM",port);
A__> idCom = CreateFile(pcPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
A__> if(idCom == INVALID_HANDLE_VALUE) return -1; // if cannot open COM port
A__> if(!SetupComm(idCom, 4096, 4096)) return -3; // if cannot set port parameters
A__> if(!GetCommState(idCom, &dcb)) return -3; // loading "dcb" by default values
A__> dcb.ByteSize = 8;
A__> dcb.BaudRate = 115200;
A__>// dcb.BaudRate = 1200;
A__> dcb.Parity = NOPARITY;
A__> dcb.StopBits = ONESTOPBIT;
A__> dcb.fDtrControl = DTR_CONTROL_DISABLE;
A__> if(!SetCommState(idCom, &dcb)) return -3; // if cannot set port parameters
A__> if(!GetCommState(idCom, &dcb)) return -3; // if cannot set port parameters
A__> if(!PurgeComm(idCom,PURGE_RXCLEAR)) return -3; // clear input buffer
A__> if(!PurgeComm(idCom,PURGE_TXCLEAR)) return -3; // clear output buffer
A__> return 0;
A__>}
A__>
A__>При приеме данных переодически возникает искажение данных, иногда потеря. C чем это связано?
A__>Если соеденить контакты скрепкой, писать и читать одной программой — все работает идеально
Определи для порта таймауты.
SetCommTimeouts
Событиями ты не пользуешся, а драйвер должен знать по истечению какого времени
передачу или прием можно считать закончеными.
ЗЫ: похоже что функция чтения возвращается раньше чем получен весь пакет.
С уважением Валерий.