求助!关于串口的问题

ybdfeb 2004-01-13 02:41:01
如下:
if (!WaitCommEvent(m_hCom, &dwMask, &os))
{
if (ERROR_IO_PENDING == GetLastError())
{
GetOverlappedResult(m_hCom, &os, &dwBytesRead, TRUE);
}
}

跟踪到GetOverlappedResult时程序就在这个函数里面转不出来,请问是何原因?

谢谢!
...全文
37 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybdfeb 2004-01-13
  • 打赏
  • 举报
回复
虽然设置了超时,但串口没有接收到数据时,GetOverlappedResult仍然会痴痴的等。这个地方一定要用定时器吗?
ybdfeb 2004-01-13
  • 打赏
  • 举报
回复
我的本意是通过串口发送数据给一设备,然后等待该设备返回的数据。
我希望做到当线路或设备出现故障无法返回数据时,程序不会一直等下去。也就是说是个超时的问题。各位大虾有没有好办法.
DotLSong 2004-01-13
  • 打赏
  • 举报
回复
超时是通过 COMMTIMEOUTS 结构设置的

COMMTIMEOUTS m_CommTimeouts;

m_CommTimeouts.ReadIntervalTimeout = 500;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 500;
m_CommTimeouts.ReadTotalTimeoutConstant = 500;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 500;
m_CommTimeouts.WriteTotalTimeoutConstant = 500;

// Configure
if (SetCommTimeouts(m_hComm, &m_CommTimeouts))
{
if (SetCommMask(m_hComm, EV_RXCHAR | EV_TXEMPTY | EV_CTS))
{
if (GetCommState(m_hComm, &m_dcbComm))
{
m_dcbComm.fRtsControl = RTS_CONTROL_ENABLE;
// set RTS bit high!
if (BuildCommDCB(szBaud, &m_dcbComm))
{
if (SetCommState(m_hComm, &m_dcbComm))
{
PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
bResult = TRUE;
}
}
}
}
}
DotLSong 2004-01-13
  • 打赏
  • 举报
回复
DWORD CLSComm::ReceiveChar(CLSComm* port, COMSTAT comstat)
{
BOOL bRead = true;
BOOL bResult = true;
DWORD dwError = 0;
DWORD dwBytes = 0;
unsigned char RXBuff;

while (1)
{
EnterCriticalSection(&port->m_csCommunicationSync);
ClearCommError(port->m_hComm, &dwError, &comstat);
LeaveCriticalSection(&port->m_csCommunicationSync);

if (comstat.cbInQue == 0)
break;

EnterCriticalSection(&port->m_csCommunicationSync);
{
if (!ReadFile(port->m_hComm, &RXBuff, 1, &dwBytes, &port->m_ov))
{
if (GetLastError() == ERROR_IO_PENDING)
GetOverlappedResult(port->m_hComm, &port->m_ov, &dwBytes, true);
}
}
LeaveCriticalSection(&port->m_csCommunicationSync);

::SendMessage(port->m_hWnd, WM_COMM_RXCHAR, (WPARAM)RXBuff, (LPARAM) port->m_uPort);
}

return dwBytes;
}
ybdfeb 2004-01-13
  • 打赏
  • 举报
回复
这个函数没有超时返回这一说吗?
vcar 2004-01-13
  • 打赏
  • 举报
回复
异步。。。。。阻塞。。。。。
fzd999 2004-01-13
  • 打赏
  • 举报
回复
BOOL GetOverlappedResult(
HANDLE hFile, // handle to file, pipe, or device
LPOVERLAPPED lpOverlapped, // overlapped structure
LPDWORD lpNumberOfBytesTransferred, // bytes transferred
BOOL bWait // wait option
);

的确是最后一个参数的问题
QunKangLi 2004-01-13
  • 打赏
  • 举报
回复
GetOverlappedResult(m_hCom, &os, &dwBytesRead, FALSE);

最后一参数为TRUE时会一直等待直到操作完成。
为FALSE时,如操作完成,返回TRUE;如失败可未完成,返回FALSE,
可据GetLastError()==ERROR_IO_INCOMPLETE来分辨
yyz2000 2004-01-13
  • 打赏
  • 举报
回复
关注
曾经的猎狐 2004-01-13
  • 打赏
  • 举报
回复
GetOverlappedResult(m_hCom, &os, &dwBytesRead, FALSE); //最后一个参数设置为FALSE

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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