求助:串口通讯问题
用串口连接两台机器,我用的是单线程,使用的是MSComm控件,一去一答,发送数据后等待回复的消息,(回复的消息我用串口调试助手发送),然后再处理。我用了一个循环,设置一个标志量,如果收到回复就继续进行下去,可是主机一方总是收不到回复的消息,OnComm总是没有办法激活。如果我使用一个AfxMessageBox(“等待”)就能激活收到,怎么解决,是不是必须要用多线成啊?谢谢 问题点数:50、回复次数:15Top
1 楼legendhui(秋天的叶子)回复于 2005-03-03 08:46:28 得分 2
你要用MSComm控件来收发消息,如果在一个按钮里同时处理收发消息,我还没有找到解决方法。有一个方法就是在OnComm函数中同时处理收发Top
2 楼jszj(老板说mis部不是赚钱的部门...)回复于 2005-03-03 08:52:11 得分 2
不会吧? 我想应该可以的
你能确定主机发送消息后调试助手能收到吗?Top
3 楼legendhui(秋天的叶子)回复于 2005-03-03 08:54:01 得分 2
楼上的
你想应该可以?你试过吗?
如果你试过可以,我虚心请教Top
4 楼auly403(卡西*丁布)回复于 2005-03-03 08:54:57 得分 2
两个com口连线有没有问题
可用两个串口调试器测试一下Top
5 楼mrxwh(大徐)回复于 2005-03-03 09:25:45 得分 5
用一个循环?是否处于死机状态了?你是使用的什么循环方式?for(;;)吗?如果是这样的话,会导致程序不工作了!
我送你一个例子吧。这是我最近工作用的。试试看。
UINT CGSMFormView::CommTest()
//发送测试参数:基本格式和形式
{
//不回显内容,从设置后1条生效
m_cSendStr=_T("ATE1\r\n");//回显
m_ctrlComm1.SetOutput(COleVariant(m_cSendStr));
m_cSendStr=_T("ATV1\r\n");//命令回显字符型
m_ctrlComm1.SetOutput(COleVariant(m_cSendStr));
Sleep(100);
m_oVar=m_ctrlComm1.GetInput();
//本条开始,回显内容
for(m_iloopCnt=0;m_iloopCnt<theApp.m_iCommLoop;m_iloopCnt++)
{
m_ctrlComm1.SetInBufferCount(0);//清除端口现有数据
m_cSendStr=_T("ATE1\r\n");
m_ctrlComm1.SetOutput(COleVariant(m_cSendStr));
m_ctrlComm1.SetRThreshold(m_cSendStr.GetLength());//接到原长度字符后产生中断
SetTimer(1,theApp.m_iCommWaitTime,NULL);
m_bTimerOkay=FALSE;
m_iCommResult=0;
m_iCommType=1; //一般命令
while(m_iCommResult<=0)
{
DoEvents();
}
if(m_iCommResult!=88)
{
continue;//继续
}
break;
}
if(m_iCommResult!=88)
{
::AfxMessageBox(_T("启动通讯错误:回显设置错误!"),MB_OK+MB_APPLMODAL+MB_ICONSTOP);
return 'E';
}
return 'K';
}
BOOL CGSMFormView::DoEvents()
// 类似VB的DOEVENTS功能
{
m_bIsDoEvents=TRUE;
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//发送结束程序指令
/*
if(msg.message ==WM_QUIT)
{
::PostQuitMessage(0);
return FALSE;//必须加入退回的语句;否则程序一致循环,当系统有机会发送
//WM_QUIT指令时候,窗口已经被关闭了,从而导致应用程序不能够
//正真的被关闭。
}
*/
::TranslateMessage(&msg);
DispatchMessage(&msg);
}
m_bIsDoEvents=FALSE;
return TRUE;
}
说明,设置好相关参数,发送数据,循环等待接收(使用DOEVENTS()函数,防止死循环),在ONCOMM()函数中,设置好处理接收的程序,即可。
有问题可以联系我。mrxwh@eyou.com,mrxwh@21cn.comTop
6 楼Aerith(艾莉斯)回复于 2005-03-03 10:47:32 得分 20
你的循环是怎么做的?是不是在纯粹的兜循环而使系统没有时间处理消息?
你在循环里加这几句话试试看:
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Top
7 楼xqk(夏乾坤)回复于 2005-03-03 11:00:17 得分 1
upTop
8 楼guyue6670()回复于 2005-03-03 11:24:12 得分 1
应该有一段等待时间,好让端口对数据进行传输和接受。Top
9 楼xinminhuibaobao(砖头)回复于 2005-03-03 12:33:20 得分 1
JustUPaGoodTopicTop
10 楼crystal521(【云淡风轻】)回复于 2005-03-03 12:52:36 得分 12
加上这个试试
MSG msg;
while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}Top
11 楼crystal521(【云淡风轻】)回复于 2005-03-03 12:53:15 得分 0
另外,在发收之间加上延时Top
12 楼mousefj(冯杰)回复于 2005-03-03 14:01:39 得分 1
//设置OnComm触发条件
CMSComm m_comm;
m_comm.SetRThreshold(1);//设置响应端口接收事件的条件Top
13 楼Eog(天之眼)回复于 2005-03-04 23:49:36 得分 0
谢谢各位,问题解决了。: Aerith(艾莉斯) crystal521(水晶泪) 的方法。Top
14 楼Eog(天之眼)回复于 2005-03-04 23:51:10 得分 0
准备结贴了,再次表示感谢,还想问问为什么加上这个就可以了?我用的是个while循环。谢谢Top
15 楼legendhui(秋天的叶子)回复于 2005-03-05 09:53:50 得分 1
加上这个循环,可以截获消息Top




