MFC一部串口接收数据,显示readfile成功,但没接到数据。

qq_30986209 2020-05-14 06:40:23
底程序:
void CComPort::ComReadData()
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
char RXBuff;
COMSTAT comstat;


//m_ROverLapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

m_ROverLapped.Offset = 0;
m_ROverLapped.OffsetHigh = 0;



//<>一个EV_RXCHAR 接收数据信号触发出,循环接收缓存区全部数据;
while (TRUE)
{
ComDetectStop();
ClearCommError(m_hPort, &dwError, &comstat);

if (bRead)
{
bResult = ReadFile(m_hPort, &RXBuff, 1, &BytesRead, &m_ROverLapped);
if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_IO_PENDING: // asynchronous i/o is still in progress go to GetOverlappedResults();
{
bRead = FALSE;
break;
}
default:
{
break;
}
}
}
}
if (!bRead)
{
bRead = TRUE;
bResult = GetOverlappedResult(m_hPort, &m_ROverLapped, &BytesRead, false);
while (!bResult)
{
ComDetectStop();
bResult = GetOverlappedResult(m_hPort, &m_ROverLapped, &BytesRead, false);
}
}
Comm_RXCHAR(RXBuff);

if (comstat.cbInQue == 0)
break;
}
}
void CDevice::Comm_RXCHAR(char c /*= 0*/)
{
static CString sTempCode;
if (c == -52)
{
m_sCodeReceived = sTempCode;
m_sCodeReceived.Trim();//保存反馈数据;
sTempCode.Empty();
m_bReceived = true;
}
}
调用程序:
BOOL CDevice::GetDevice(CString &sCode, short nTimeout /*= 3000*/)
{
m_bReceived = false;

ComReadData();
short nIndex = 0;
while (nIndex < nTimeout)
{
if (m_bReceived)
{
sCode = m_sCodeReceived;
return true;
}
nIndex++;
Sleep(1);
}
ComReset();
return false;
}
按键调用:
void CRS485_2_1Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CString sCode;
if (!m_device.GetDevice(sCode))
{
SetDlgItemText(IDC_EDIT2, _T("获取失败"));
return;
}
SetDlgItemText(IDC_EDIT2, _T(""));//清空;
SetDlgItemText(IDC_EDIT2, sCode);
}
...全文
399 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevancheng 2020-05-18
  • 打赏
  • 举报
回复
设置同步模式处理起来简单,重叠IO 实际读取数量不一定=你要读取的数量,你这种是正常现象
qq_30986209 2020-05-16
  • 打赏
  • 举报
回复
加了这句之后会有乱码,比如我发123,收到的是 1233烫。
zgl7903 2020-05-16
  • 打赏
  • 举报
回复
在接收处设置断点调试, 调试是一个程序员必备的基本技能
zgl7903 2020-05-14
  • 打赏
  • 举报
回复
Comm_RXCHAR 中的逻辑不完整吧


void CDevice::Comm_RXCHAR(char c /*= 0*/)
{
static CString sTempCode;
if (c == -52)
{
m_sCodeReceived = sTempCode;
m_sCodeReceived.Trim();//保存反馈数据;
sTempCode.Empty();
m_bReceived = true;
}
else
{
sTempCode += c;
}
}

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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