MFC等待串口消息返回

李水云 2018-08-15 08:44:02
想实现的功能是主程序向串口发送消息,根据串口返回的内容进行下一步操作。 用on事件触发时,必须等到主程序退出后on事件才触发,用了多线程也一样,不太了解消息队列机制。怎么能解决这个问题。
...全文
340 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
李水云 2018-08-17
  • 打赏
  • 举报
回复
用阻塞方式,阻塞进程,等待线程执行完再执行进程。
zgl7903 2018-08-16
  • 打赏
  • 举报
回复
建议使用后台线程 + 状态机模型 来处理

while(1)
{
switch(nStat)
{
case(_Send): …… break; //发送
case(_WaitAck): …… break; //等待响应
case(_xxxxx) ……
}
}
李水云 2018-08-16
  • 打赏
  • 举报
回复
没人回答吗?水下分
李水云 2018-08-16
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
建议使用后台线程 + 状态机模型 来处理

while(1)
{
switch(nStat)
{
case(_Send): …… break; //发送
case(_WaitAck): …… break; //等待响应
case(_xxxxx) ……
}
}


//网上搜不到相关信息

我重写了多线程发现有一半的几率能达到我的效果。

准确的说我要的是 多线程1先执行一部分,然后多线程2执行完成,然后1在执行完成才能实现我的要求。
李水云 2018-08-15
  • 打赏
  • 举报
回复
void CCommonDlg::Inspection()
{
CString instructText;
instructText=_T(":VOLT:DC:NPLC FAST;NPLC PLAC4"); //设为快速测量,精度41/2(默认自动量程)
m_mscomm.put_Output(COleVariant(instructText));
Sleep(1000);//必须延时等待上一条执行完毕
instructText=_T(":FETC?"); //查询测试结果 如果与上一条指令相连 则会测试之前的设置而不一定是直流电压
m_mscomm.put_Output(COleVariant(instructText));
//instructText=(m_Com->ReceiveCommMscomm());
CWinThread *m_pThread;
m_pThread=AfxBeginThread(ThreadProc, this);
HANDLE hThread;
WaitForMultipleObjects(1,&hThread,TRUE,INFINITE);//线程数、线程ID、是否执行完毕、等待时间
//UINT ThreadProc(LPVOID param);
}


UINT CCommonDlg::ThreadProc(LPVOID param)
{

VARIANT variant_inp; //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed.
CString str1,str2;

while(1)
{
if((m_Com->m_mscomm.get_CommEvent()) == 2) //事件值为2表示接收缓冲区内有字符
{
////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_Com->m_mscomm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);//字符型
str1.Format(_T("%c"),bt); //将字符送入临时变量strtemp存放
str2+=str1; //加入接收编辑框对应字符串
}
}
break;
}
str2=m_Com->Notation(str2);//将科学计数转为普通级计数
m_Com->MessageBox(str2,_T("输出返回信息"));
return 0;
}

还是贴下代码,是在MFC界面下由按钮空间触发。所以m_Com->MessageBox(str2,_T("输出返回信息"))这个输出信息都会延后输出,比如第一次显示什么都没,第二次显示是第一次的结果。感觉就是 要主程序运行完毕后才会读取串口消息。
李水云 2018-08-15
  • 打赏
  • 举报
回复
自己先水下,快没分了。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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