出现问题是这样的:
1.当我程序运行起来,串口已经打开准备接收数据,这时用串口助手向串口发送数据,数据正常。
2.但是我先用串口助手不停发数据,然后再打开写的程序接收程序,数据出现错乱,这里的错乱不是指顺序错乱,而是出现了发送数据里根本没有的数据。
不停发送的是16字节数据:AA 00 00 08 00 00 00 01 00 AA 00 00 AA 00 AA
情况1数据正常:
情况2数据错乱:
出现了根本没有的数据。
————————————————————————————————————————————————————————————————————
我用两个串口助手互传,都接收正常,肯定是程序的问题。所以希望大神们帮我看一看代码。
我准备用的是线程+同步IO读取。
串口配置代码如下,都是抄的网上的,感觉这部分出错的概率比较大?
void SETUP_DCB()
{
DCB dcb;
memset(&dcb, 0, sizeof(DCB) );
GetCommState(hComFile, &dcb);
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600; //波特率
dcb.fParity = FALSE; //无奇偶校验
dcb.Parity = NOPARITY; //无校验
dcb.StopBits = ONESTOPBIT; //1位停止位
dcb.ByteSize = 8; //数据位数
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
SetCommState(hComFile, &dcb);
}
hComFile = CreateFile(L"COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hComFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hComFile);
return TRUE;
}
SETUP_DCB();
hThread = CreateThread(NULL, 0, MyThreadFunction, NULL, 0, &ThreadID);
线程读取代码,主要功能就是帧同步,但是数据都是错乱的肯定不能同步了。
以下代码就读取错乱,读取的17字节不对:
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
...
i = ReadCount;
while (i)
{
ClearCommError(hComFile, &Errors, &comstat);
ReadFile(hComFile, pBuffer + ReadCount - i, i, &NumberOfRead, NULL);
i -= NumberOfRead;
}
...
}
完整读取代码:
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
DWORD NumberOfRead;
DWORD Errors;
COMSTAT comstat;
unsigned char BUFFER[17], *pBuffer;
unsigned char header, i;
int ReadCount;
ReadCount = 17;
pBuffer = BUFFER;
while (1)
{
i = ReadCount;
while (i)
{
ClearCommError(hComFile, &Errors, &comstat);
ReadFile(hComFile, pBuffer + ReadCount - i, i, &NumberOfRead, NULL);
i -= NumberOfRead;
}
if (BUFFER[0] == 0xAA && BUFFER[16] == 0xAA) //有效帧
{
ReadCount = 17;
pBuffer = BUFFER;
continue;
}
for (header = 1; header < 17 && BUFFER[header] != 0xAA; header++);
for (i = header; i < 17; i++)
BUFFER[i - header] = BUFFER[i];
ReadCount = header;
pBuffer = BUFFER + (17 - ReadCount);
}
}
希望大神指点指点,非常感谢!
[课程]Linux pwn 探索篇!