在波特率115200下、接收对方0.01秒间隔发送的数据(数据大约30字节),发现接收到的数据丢失的很厉害(只收到约30%多)。接收是如下方式的:
HANDLE h = CreateEvent(NULL,TRUE,FALSE,NULL);
while (true)
{
memset(&o,0,sizeof(o));
o.hEvent = h;
if (WaitCommEvent(hComm, &flag, &o))
{
}
WaitForSingleObject(o.hEvent,INFINITE); //5000
ClearCommError(hComm,&dwErr,&comstat);
size = comstat.cbInQue;
if (size == 0)
return 0;
if(!ReadFile(hComm,&data[index],size,&dw, &o))
{
GetOverlappedResult(hComm,&o,&dw,TRUE);
ResetEvent(o.hEvent);
CloseHandle(o.hEvent);
//index++;
}
else
index+=dw; //读到指定的内容
if (dw > 0) break;
ResetEvent(o.hEvent);
}
CloseHandle(o.hEvent);
因为发送方不是我写的,无法使用流控,请问大家有什么方法可以解决?
HANDLE h = CreateEvent(NULL,TRUE,FALSE,NULL);
while (true)
{
memset(&o,0,sizeof(o));
o.hEvent = h;
if (WaitCommEvent(hComm, &flag, &o))
{
}
WaitForSingleObject(o.hEvent,INFINITE); //5000
ClearCommError(hComm,&dwErr,&comstat);
size = comstat.cbInQue;
if (size == 0)
return 0;
if(!ReadFile(hComm,&data[index],size,&dw, &o))
{
GetOverlappedResult(hComm,&o,&dw,TRUE);
ResetEvent(o.hEvent);
CloseHandle(o.hEvent);
//index++;
}
else
index+=dw; //读到指定的内容
if (dw > 0) break;
ResetEvent(o.hEvent);
}
CloseHandle(o.hEvent);
因为发送方不是我写的,无法使用流控,请问大家有什么方法可以解决?
解决方案 »
- 哪位给个ODBC连接数据库用并把数据库里的表完全的显示在MFC中的list control控件中,这个迷茫很久了。求指点
- QQ 如何嗅探IP
- 如何让网站服务器上的dll自动更新到本地
- 请教高手,如何开发关键字,保留字高亮显示功能的软件
- 请教socket编程问题 小弟最近编了一个基于udp的简单程序。。
- 我自己在一个工程里定义了一个类,我怎么用把它保存下来呢?在别的工程里怎么引用呢?
- 看了网上的一些资料介绍,关于服务程序有个疑问,2小时内一定给分
- 一个超简单问题, 如何安排多个VC子项目的目录
- 小问题, VC.NET 下MFC 编写的ActiveX 如何获取版本信息
- 我是一个C++新手,请问我应该先学些什么?
- ■■寻找VC++程序高手,有小项目合作,是高手的请进■■
- 如何编程获得NET SEND程序的输出???
或
再读之前Sleep一下.
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
unsigned char RXBuff; //串口通讯设备文件读如数据存储缓冲单元。(一次只读一个字符) for(;;) //串口通讯设备读数据循环(死循环)
{
//进入临界区。
EnterCriticalSection(&port->m_csCommunicationSync);
//ClearCommError()函数将修改COMSTAT结构和清除其他错误。
bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
//退出临界区。
LeaveCriticalSection(&port->m_csCommunicationSync); //如果接收队列空,则退出读取(接收)数据循环。
if(comstat.cbInQue==0) break; //再次进入临界区。
EnterCriticalSection(&port->m_csCommunicationSync);
if(bRead)
{
//读串口通讯设备文件。
bResult=ReadFile(port->m_hComm, //串口通讯设备文件句柄。
&RXBuff, //接收数据的缓冲区指针。
1, //指定要从文件中读取的字节数。
&BytesRead, //返回本次操作实际读入的字节数。
&port->m_ov); // pointer to the m_ov structure
if(!bResult) //读数据失败
{
switch(dwError=GetLastError())
{ //根据读数据错误码进行处理。
case ERROR_IO_PENDING:
{
// asynchronous i/o is still in progress
// Proceed on to GetOverlappedResults();
bRead = FALSE;
break;
}
default:
{
// Another error has occured. Process this error.
port->ProcessErrorMessage("ReadFile()");
break;
}
}
}
else //读数据正确。
bRead = TRUE;
} if(!bRead) //读数据不正确。
{
bRead=TRUE;
//取得最后的操作错误结果。
bResult=GetOverlappedResult(port->m_hComm, //串口通讯设备文件句柄。
&port->m_ov, // Overlapped 结构。
&BytesRead, //返回该操作的字节数。
TRUE); //操作是否仍在进行中。
//失败。
if(!bResult) port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");
}
//离开临界区。
LeaveCriticalSection(&port->m_csCommunicationSync); //向〈父窗口〉发送接收一个字符消息, 串口接收字符消息,接收的字符数据, 串口号。
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM)RXBuff, (LPARAM)port->m_nPortNr);
}//结束死循环
我这么写的。从来没有出过任何差错。与波特率关系不大。关键是代码不能有漏洞