串口事件的捕捉问题

qinxiaolin 2004-12-30 01:08:04
本人在写一个串口通信程序,对串口事件的捕捉问题不太明白,现有几个问题要请教大家:

上网查过的资料几乎都一个版本的:
就是————捉串口事项。mscomm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。

在mainfrm.h中:

protected:

afx_msg void oncommmscomm();

declare_eventsink_map()

在mainfrm.cpp中:

begin_eventsink_map(cmainframe,cframewnd )  

on_event(cmainframe,id_commctrl,1,oncommmscomm,vts_none)

           //映射activex控件事件

end_eventsink_map()
然后就是写
void CInputDlg::OnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT vResponse;
int k;
CString m_Zero;
if(m_Com.GetCommEvent()==2)
{
k=m_Com.GetInBufferCount();
if(k>0)
{
vResponse=m_Com.GetInput();

}

}

}
但我写的这个东西,在完成一次完整的操作的过程中,要发送多次命令(数据),发送的同时也要多次检测
串口返回的数据(也即捕捉串口事件),然后根据返回的数据结果,再发送下一个命令。
但我不明白,OnCommMscomm1() 函数是什么时候开始执行的???这个函数不是直接调用的,
稍微控制的不好,m_Com.GetCommEvent()这个函数我根本就跟踪不到,
oncommmscomm(); 到底是怎么用的啊

...全文
283 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bailinggui 2005-01-17
  • 打赏
  • 举报
回复
这是我做的,你参考一下
while(ABSGetInput() != "08 ")
{
m_nBreakFlag ++ ;
if(m_nBreakFlag > 10000)
{
AfxMessageBox("联接超时\n造成此错误的原因如下,请逐一检查:\n1 气囊类型是否匹配\n2 串口选择是否恰当\n3 硬件联接是否完好") ;
m_nBreakFlag = 0 ;
dlg.DestroyWindow() ;
return ;
}
}
lrmao1 2005-01-10
  • 打赏
  • 举报
回复
mscomm没用过,用API吧,很好用的,
waitcomevent();,和相关的东西
GetOvandleR,,,,
再就是在你的线程里,createvent,用waitsingleevent(),或waitmultilevent(),就可以了,
qinxiaolin 2005-01-02
  • 打赏
  • 举报
回复
to  seawave03(海浪)
这一着我早就试过了,如果用循环语句判断m_Com.GetCommEvent()==2事件是否发生,那就回进入死循环,因为OnCommMscomm1() 函数根本就没有机会执行,我在循环语句判断m_Com.GetCommEvent()==2
中有加了个计数器cc<10000的条件,一旦cc>10000跳出循环,M!=1,又会执行
esle
{做其他处理;

我做了个尝试,在m_Com.SetOutput(COleVariant(m_Array));//发送命令后
我让它弹出一个确定对话框,当我点击确定的时候,程序会进入OnCommMscomm1()函数,进而捕捉到
m_Com.GetCommEvent()==2事件,但这种东西,用户根本没有办法使用.
出现上述情况,我想可能是因为,弹出对话框的时候,当前的线程挂起,所以OnCommMscomm1()函数才有机会执行.基于上述想法,我想用线程试试,但OnCommMscomm1()是系统自动调用的,只有在发送命令的函数上想办法,
   我想在m_Com.SetOutput(COleVariant(m_Array));执行后,创建一个线程,让他挂起,希望程序能转去执行OnCommMscomm1(),等待m_Com.GetCommEvent()==2事件的发生,
本人对线程不熟悉,做了一些尝试没有成功~~,
在执行完m_Com.SetOutput(COleVariant(m_Array));//发送命令后

我接着创建了一个线程事件对象
m_ov.hEvent=CreateEvent(NULL, // pointer to security attributes
FALSE, // flag for manual-reset event
FALSE, // flag for initial state
""); // pointer to event-object name
然后通过bSuccess = WaitCommEvent(m_hCom,EV_RXCHAR , &m_ov);来捕捉(等待)EV_RXCHAR(接受到字符并放入输入缓冲区)事件.结果还是没有成功

高手应该很多,怎么没有人愿意帮忙啊~~~希望大家多给点意见


seawave03 2005-01-02
  • 打赏
  • 举报
回复
没多看,不是太明白。
不过,如果你要等到m_Com.GetCommEvent()==2事件发生后才做
if(M==1)
{再取返回的数据,根据返回的结果;决定是否发送下一条指令
m_Com.SetOutput(COleVariant(data));
 }
esle
{做其他处理;



可以加个循环语句判断m_Com.GetCommEvent()==2事件是否发生,未发生一直循环等待。
qinxiaolin 2004-12-31
  • 打赏
  • 举报
回复
在void CInputDlg::OnCommMscomm1() 函数中我通过修改一个全局变量M的值,
{
// TODO: Add your control notification handler code here
VARIANT vResponse;
int k;
CString m_Zero;
if(m_Com.GetCommEvent()==2)
{
k=m_Com.GetInBufferCount();
if(k>0)
{
vResponse=m_Com.GetInput();
M=1;//在我发送命令的函数中通过访问M是否等于1来确定m_Com.GetCommEvent()==2事件有没     //有发生;


}
}
}
发送命令的函数void CInputDlg::ReadCpu_Mc68(const WORD &ReadAddrBeg,const WORD &ReadAddrEnd)
{m_Com.SetOutput(COleVariant(m_Array));//发送命令后
if(M==1)
{再取返回的数据,根据返回的结果;决定是否发送下一条指令
m_Com.SetOutput(COleVariant(data));
 }
esle
{做其他处理;



但现在的问题是,有时候根本就等不到m_Com.GetCommEvent()==2事件的发生,程序就已经往下执行了,.也就是 if(M==1)不成立,转去执行else语句了,
有什么解决办法吗??
很急的啊~~,
danielzhu 2004-12-31
  • 打赏
  • 举报
回复
UP
wangcx 2004-12-30
  • 打赏
  • 举报
回复
可以看看《串口通信指南》 水利水电出版社的
qinxiaolin 2004-12-30
  • 打赏
  • 举报
回复
有没有对MSCOMM32比较了解的啊
   有相关资料的可否给小弟发一份!
 Email: 13998500431@163.com
分不够可以再加!不胜感激啊

6,125

社区成员

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

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