MFC 写的串口助手当一直处在接收数据状态的时候会卡主 无法进行其他操作

Sky-Ye 2017-03-03 06:05:11
最近在学习用MFC MSComm接口来写串口助手,遇到一个问题,发现当串口一直处在数据接收时,刚开始其他button按键消息还能响应,过一会儿其他按键消息也不能响应,接收的字节数也无法更新,只有接收框内数据在更新,其他界面都无法响应。
网上查资料说需要多线程控制,MSComm控件如何使用多线程来解决这个问题,或是有其他办法?求高人指点。。。。。。

如下是接收事件部分代码:
void CSerialCommAppDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
VARIANT m_varInput;
CString strtemp;
COleSafeArray safearray_input;
long len = 0, k = 0;
BYTE RxData[MAX_BUFFER_SIZE];//设置byte数组MAX_BUFFER_SIZE=2048
strtemp.Empty();

if (m_MSComm.get_CommEvent() == 2)//事件2表示接受缓冲区有字符
{
m_varInput = m_MSComm.get_Input();//读接收缓冲区
//safearray_input = m_varInput;//variant数据转换成colesafearray型变量
safearray_input.Attach(m_varInput);
len = safearray_input.GetOneDimSize();//得到有效数据长度

for (k = 0; k<len; k++) //转换为byte型数组
safearray_input.GetElement(&k, RxData + k);

if (m_checkHEXShow.GetCheck()) //选择十六进制显示
{
for (k = 0; k < len; k++)
{
strtemp.Format(_T("%02X "), *(RxData + k));//将BYTE型数组转换成HEX变量
m_editRecieve += strtemp; //加入接收编辑框相应字符串
}
}
else
{ //选择字符显示
for (k = 0; k < len; k++)
{
strtemp.Format(_T("%c"), *(RxData + k));//将BYTE型数组转换成CString型变量
m_editRecieve += strtemp;//加入接收编辑框相应字符串
}
}

m_editRecieveNum += len; //接收字节数计数
m_strRichEditRecieve.Format(_T("接收:%d"), m_editRecieveNum);
UpdateData(false);//更新编辑框内容

//m_ceditRx.SetSel(-1, -1);
//this->SetDlgItemTextW(IDC_EDIT2, m_editRecieve);//将m_EditReceive内容显示到ID为IDC_EDIT2的编辑框的最后位置
m_ceditRx.LineScroll(m_ceditRx.GetLineCount() - 1, 0);//将垂直滚动条滚动到最后一行

}

}
...全文
1232 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sky-Ye 2017-03-30
  • 打赏
  • 举报
回复
为什么还没有人帮忙看看。。。自己顶一下
Sky-Ye 2017-03-03
  • 打赏
  • 举报
回复
求大牛指点。。。。。。

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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