Re: Искажение данных при чтении с COM порта
От: sva1509  
Дата: 11.11.04 17:46
Оценка:
Здравствуйте, 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
Событиями ты не пользуешся, а драйвер должен знать по истечению какого времени
передачу или прием можно считать закончеными.

ЗЫ: похоже что функция чтения возвращается раньше чем получен весь пакет.

С уважением Валерий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.