win7下ReadFile进行读串口数据 接收到的总是0 ,急

海木漄 2012-08-08 03:12:49
void LComm::_read_data(LComm* comm) // 读数据
{
EnterCriticalSection(&comm->m_Cs);
BOOL bResult;
DWORD BytesRead = 0, dwError = 0;
COMSTAT cs;
unsigned char RXBuff;
// ;
// BYTE* LPBuffer;
// unsigned char rBuf1[MAX_PATH], rBuf2[MAX_PATH];
int ret = 0;
for (; ;) {
ClearCommError(comm->m_hComm, &dwError, &cs);
if (cs.cbInQue == 0)
break; // Exit for
ret = ReadFile(comm->m_hComm, &RXBuff, sizeof(RXBuff), &BytesRead,
&comm->m_ov);

if (!ret) {
ret = GetLastError();
Frmain->Memo1->Lines->Add(IntToStr(ret));
Frmain->Memo1->Lines->Add("Read Error " + IntToStr((int)BytesRead) +
"Bytes");
switch (dwError = GetLastError()) {
case ERROR_IO_PENDING:
bResult = GetOverlappedResult(comm->m_hComm,
// Handl to COMM port
&comm->m_ov, // Overlapped structure
&BytesRead, // Stores number of bytes read
true);
// Read OverLapped Error
if (!bResult) {
comm->RecError(ERR_READ_OL, comm->m_SendData[2]);
}
break;
default:
// Read Other Error
comm->RecError(ERR_READ_OTHERERR, comm->m_SendData[2]);
break;
}
}
else { // Read Successful
comm->RecByte(RXBuff);
}
} // end for
LeaveCriticalSection(&comm->m_Cs);
}
...全文
985 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haozi596 2013-02-22
  • 打赏
  • 举报
回复
我也一样 既不等待 也不返回失败 就是返回成功而且真实字节数为0没办法····
僵哥 2012-08-09
  • 打赏
  • 举报
回复
添加调试代码的时候一定要非常注意,往往新人很容易为了调试目的输出一些信息在代码段当中添加一些看似无关紧要的代码而改变了原代码的执行逻辑,从而为自己排查问题挖出另一个陷阱。
僵哥 2012-08-09
  • 打赏
  • 举报
回复
应该不是问题。主要是Win7进行了一些优化处理,函数返回得更快了,还没等读取到数据就返回了。
不过,在你的代码当中有两次GetLastError,这个是可能存在问题了,后一次的GetLastError可能会因为前面的几行代码而改变,既然前面已经有ret=GetLastError,那么后面的switch里面就不要再写dwError=GetLastError,而换成dwError=ret。这样才有可能执行到“case ERROR_IO_PENDING:”。
海木漄 2012-08-09
  • 打赏
  • 举报
回复
感谢回复了,
MSDN社区也有不少人提到过这个问题,主要是UNICODE的问题,
算了,懒的去封装测试了,因为必须要赶时间出产品了,最后还是用控件解决问题了。

海木漄 2012-08-08
  • 打赏
  • 举报
回复
xp,win200,win98下均可以正常通讯,只是WIN7下则不行,每次读的全是0字节数据,有知道的吗?
感激不尽啊

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧