(WinAPI)串口通信丢包啊!!求解!!(有码有真相!)
用WinAPI写了个串口通信的程序 但发送数据时丢包很严重啊!找了好久都不知道为什么···
这是串口初始化的程序:
hCom = CreateFile(FliName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL
);
if(hCom == INVALID_HANDLE_VALUE)
{
return false;
}
SetupComm(hCom, 4048, 4048);
COMMTIMEOUTS TimeOut;
TimeOut.ReadIntervalTimeout = 20; //任意相邻连个字符之间的超时设置
TimeOut.ReadTotalTimeoutConstant = 30; //读操作总的超时时间的修正常量
TimeOut.ReadTotalTimeoutMultiplier = 100; //读操作总的超时时间的系数
TimeOut.WriteTotalTimeoutConstant = 500; //写操作总的超时时间的修正常量
TimeOut.WriteTotalTimeoutMultiplier = 510; //写操作总的超时时间的系数
SetCommTimeouts(hCom, &TimeOut);//设置超时
DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_9600; //波特率
dcb.ByteSize = 8; // number of bits/byte, 4-8 指定端口当前使用的数据位
dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法
dcb.StopBits = TWOSTOPBITS; //指定端口当前使用的停止位数
SetCommState(hCom,&dcb);
PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);
这是接收数据的代码:
OVERLAPPED osRead;
memset(&osRead, 0, sizeof(OVERLAPPED));
osRead.hEvent = CreateEvent(0, true, false, 0);
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD dwBytesRead = sizeof(szReceive);
BOOL bReadStat;
ClearCommError(_hComReceive, &dwErrorFlags, &ComStat);
dwBytesRead = min(dwBytesRead, (DWORD)ComStat.cbInQue);
if(!dwBytesRead)
{
CloseHandle(osRead.hEvent);
return false;
}
bReadStat = ReadFile(_hComReceive, szReceive, dwBytesRead, &dwBytesRead, &osRead);
if(!bReadStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(osRead.hEvent, INFINITE);
}
}
PurgeComm(_hComReceive, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXCLEAR);
这是发送数据的代码:
OVERLAPPED osWrite;
memset(&osWrite, 0, sizeof(OVERLAPPED));
osWrite.hEvent = CreateEvent(0, true, false, 0);
if(osWrite.hEvent == INVALID_HANDLE_VALUE)
{
AfxMessageBox("发送 CreateEvent() error");
CloseHandle(osWrite.hEvent);
return ;
}
DWORD dwBytesWrite = sizeof(szReceive);
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(_hComSend, &dwErrorFlags, &ComStat);
bWriteStat = WriteFile(_hComSend, szReceive, dwBytesWrite, &dwBytesWrite, &osWrite);
//Sleep(30);
if(!bWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(osWrite.hEvent, 30);
}
}
CloseHandle(osWrite.hEvent);
我用串口通信助手试过了 电脑没问题,接收时也挺正常,就是发送时会丢包! 200ms发一次不会丢包 但是小于200ms的话就会丢包了 多线程我也用了,但还是一样 代码不够的话我再贴,各位帮帮忙吧··