|
问题的主要原因并不在PDA,而在于你的处理代码,
因为:
1.串口驱动一般默认buffer超过1000字节,而且你的波特率那么低,一般不会发生buffer溢出的问题。
2.流控是需要注意的问题,在你配置打开串口时必须填写该类参数,但是这只影响到数据的正确性,并不直接造成数据减少。
3.最主要的问题在于,串口驱动的原理是一个字节一个直接传输的,也就是每次只能传8位,这就造成,你误以为每帧数据会按照你设想的传来一个完整的,而实际却总是缺了后面一段(注意下面ReadIntervalTimeout的数值,建议如果115200可填1,会有改善),所以你这里必须做一个完整的流程,保证数据不会丢失。一般做法是接受到RXCHAR之后,做一个循环去不停读取buffer,一直读到空再跳出,然后等待下一次RXCHAR。这里必须这么做,因为操作系统并不是等待你设想的每帧结束才产生这个event,而是根据系统中断响应时间相对随机产生的。
这里给出一个实际的配置,是有流控的,并且注意timeout那一段需要根据你的机器性能来调整
hHandle = CreateFile(szComName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if(hHandle != INVALID_HANDLE_VALUE)
{
// Get serial port state
memset(&dcb, 0, sizeof(DCB));
GetCommState(hHandle, &dcb);
// Set com port parameters
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fTXContinueOnXoff = TRUE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.BaudRate = dwBaudRate ;
SetCommState(hHandle, &dcb);
// Set serial port event mask
SetCommMask(hHandle, EV_BREAK | EV_ERR | EV_RXCHAR) ;
// Set serial port access time out
GetCommTimeouts(hHandle, &cto);
cto.WriteTotalTimeoutConstant = 100;
cto.WriteTotalTimeoutMultiplier = 1;
cto.ReadTotalTimeoutConstant = 100;
cto.ReadTotalTimeoutMultiplier = 1;
cto.ReadIntervalTimeout = 2;
SetCommTimeouts(hHandle,&cto);
}
|
|