MFC串口编程,用的是MSCOMM控件,为什么发送多条命令时不会发一条,接收一条;而是所有发完再返回?

LINUX-ROS 2014-07-22 04:29:57
用串口那个控件写了一个串口程序,在按钮响应函数中,我连续发送三条命令,执行结果不会发一条接收一条,而是三条发送完一下子接收三条返回指令。更奇怪的是在发送一条命令后加一句Messagebox,就会立马返回。求大神们指点一下,谁遇到这样的问题,小弟初学串口编程,实在找不到原因了。
...全文
288 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LINUX-ROS 2014-07-24
  • 打赏
  • 举报
回复
引用 7 楼 baichi4141 的回复:
[quote=引用 5 楼 bpengj3375 的回复:] 能否不用加Messagebox让它发送一条,立马返回;接着再发送,再返回?
首先,建议你改掉“立马”这类用词,以及与之关联的感性思维。 串口通信是不可能立刻返回的,首先串口的通信效率就比较低。程序从一条语句运行到下一条语句可能只需要几纳秒,此时串口可能连一个字节都没发完 你真正的需求是:“等待串口返回后,再发送下一段数据”以及“在等待期间,让接收返回数据的功能正常执行”。 MessageBox,以及任何模态对话框,都在内部处理消息队列,使得以消息队列为基础的其他功能能够正常运行。在这里,你可以用while循环来延时,内部添加TranslateMessage等函数来处理消息队列。
MSG msg ;        
while(TRUE)       
{            
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))           
{                
TranslateMessage (&msg) ;         
DispatchMessage (&msg) ;                     
}

if(循环时间超过0.5秒)
break;
}
[/quote] 我把程序里面加这个while循环,但是延时时间太长怎么办? while(TRUE) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } i++; if(i==5) { i=0; break; } }
lujunql 2014-07-23
  • 打赏
  • 举报
回复
感觉的代码上有问题!你用的是什么接收机制?
baichi4141 2014-07-23
  • 打赏
  • 举报
回复
第一,所有数据对于通信来说就是字节流,不管它是什么控件,它都不知道前五个字节和后七个字节有什么区别,更加不知道你所谓的“命令”是啥玩意 第二,MessageBox中断了当前函数的执行,又在新开的对话框内进行消息处理,所以不会影响通过响应消息来接收数据的串口控件,而Sleep则是中断当前线程的执行,导致接收数据功能也被停止了
LINUX-ROS 2014-07-23
  • 打赏
  • 举报
回复
不是啊,我加的也有Sleep,但是无论加多大延迟都不行,都是先发送完再接收
LINUX-ROS 2014-07-23
  • 打赏
  • 举报
回复
引用 7 楼 baichi4141 的回复:
[quote=引用 5 楼 bpengj3375 的回复:] 能否不用加Messagebox让它发送一条,立马返回;接着再发送,再返回?
首先,建议你改掉“立马”这类用词,以及与之关联的感性思维。 串口通信是不可能立刻返回的,首先串口的通信效率就比较低。程序从一条语句运行到下一条语句可能只需要几纳秒,此时串口可能连一个字节都没发完 你真正的需求是:“等待串口返回后,再发送下一段数据”以及“在等待期间,让接收返回数据的功能正常执行”。 MessageBox,以及任何模态对话框,都在内部处理消息队列,使得以消息队列为基础的其他功能能够正常运行。在这里,你可以用while循环来延时,内部添加TranslateMessage等函数来处理消息队列。
MSG msg ;        
while(TRUE)       
{            
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))           
{                
TranslateMessage (&msg) ;         
DispatchMessage (&msg) ;                     
}

if(循环时间超过0.5秒)
break;
}
[/quote] 恩,你分析的很对,我的意思就是程序代码执行完一条命令后,等待有返回,然后再接着发送下一条命令。
lujunql 2014-07-23
  • 打赏
  • 举报
回复
你可以这样试试: 你发送的数据后增加一个回车字符,ASCII码13。
baichi4141 2014-07-23
  • 打赏
  • 举报
回复
引用 5 楼 bpengj3375 的回复:
能否不用加Messagebox让它发送一条,立马返回;接着再发送,再返回?
首先,建议你改掉“立马”这类用词,以及与之关联的感性思维。 串口通信是不可能立刻返回的,首先串口的通信效率就比较低。程序从一条语句运行到下一条语句可能只需要几纳秒,此时串口可能连一个字节都没发完 你真正的需求是:“等待串口返回后,再发送下一段数据”以及“在等待期间,让接收返回数据的功能正常执行”。 MessageBox,以及任何模态对话框,都在内部处理消息队列,使得以消息队列为基础的其他功能能够正常运行。在这里,你可以用while循环来延时,内部添加TranslateMessage等函数来处理消息队列。
MSG msg ;        
while(TRUE)       
{            
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))           
{                
TranslateMessage (&msg) ;         
DispatchMessage (&msg) ;                     
}

if(循环时间超过0.5秒)
break;
}
LINUX-ROS 2014-07-23
  • 打赏
  • 举报
回复
引用 4 楼 lujunql 的回复:
感觉的代码上有问题!你用的是什么接收机制?
接收就是用的这个: void CWriteCardDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 unsigned int i = 0; VARIANT variant_inp; COleSafeArray safearray_inp; int data_len; char cData[1024]; LONG len,k; BYTE rxdata[2048];//发送二进制数据(按字节发送)时,将字节型数据存放在VARIANT型变量中 CString strtemp; if(m_comm.get_CommEvent()==2)//=2则接收缓冲区中有数据 { variant_inp=m_comm.get_Input();//读缓冲区 data_len = variant_inp.parray->rgsabound->cElements; memcpy(cData,(char *)variant_inp.parray->pvData,data_len); cData[data_len] = 0; for(i=0;i< data_len;i++) { RxBuffer[i]=cData[i];//取出接收到的数据 } safearray_inp=variant_inp; //变量类型转换 len=safearray_inp.GetOneDimSize();//得到有效数据长度 for(k=0;k<len;k++) { safearray_inp.GetElement(&k,rxdata+k);//转换成BYTE型数组 } UpdateData(TRUE); for(k=0;k<len;k++) //16进制显示 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format(_T("%02X "),bt);//将字符送入临时变量strtemp存放 //AfxMessageBox(strtemp); m_editReceive +=strtemp;//加入接收编辑框对应字符串 } } UpdateData(FALSE); }
LINUX-ROS 2014-07-23
  • 打赏
  • 举报
回复
引用 3 楼 baichi4141 的回复:
第一,所有数据对于通信来说就是字节流,不管它是什么控件,它都不知道前五个字节和后七个字节有什么区别,更加不知道你所谓的“命令”是啥玩意
第二,MessageBox中断了当前函数的执行,又在新开的对话框内进行消息处理,所以不会影响通过响应消息来接收数据的串口控件,而Sleep则是中断当前线程的执行,导致接收数据功能也被停止了



能否不用加Messagebox让它发送一条,立马返回;接着再发送,再返回?
boylafong 2014-07-22
  • 打赏
  • 举报
回复
你加Messagebox是因为人为的延迟了,跟sleep一个效果

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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