四、 串口通信的使用方法和技巧
4.1 通过人工映射事件自动响应函数
通信控件的工作原理类似与中断方式,当有通信事件发生时(如发送数据、接收数据等),就会触发OnComm事件,在该事件的处理函数中调用OnCommEvent()函数,通过返回值即可确定是那类事件,再作出相应的处理。
但需要注意的是,OnCommEvent()函数并不是自动映射的,必须手工添加该事件映射函数。其方法如下:
示例中是在主框架类中调用通信控件类函数。所以先要在Mainfrm.h添加如下消息映射函数。
afx_msg void OnCommEvent();
然后在Mainfrm.cpp中添加如下代码
BEGIN_EVENTSINK_MAP(CMainFrame, CFrameWnd)
ON_EVENT(CMainFrame, ID_COMMCTRL, 1, OnCommEvent, VTS_NONE)
END_EVENTSINK_MAP()
接下来就可以在void CMainFrame::OnCommEvent()函数中处理各种串口响应事件。
串口收发数据时,若数据只用 ANSI 字符集,则用文本方式收发。对其它字符数据,如数据中有嵌入控制字符、Nulls 等等,则使用二进制方式。
其中一个需要注意的问题是函数SetInput()发送的是VARIANT型变量,而我们输入的一般是CString型变量,因此必须进行转换。先将CString型变量转换为BYTE型数组,再将转换为ColeSafeArray型变量,然后将其组转换为VARIANT型变量发送出去。这个转换过程看起来比较复杂,但它可以满足用不同的变量类型来发送数据。在串口接收数据时,也要做类似的变量类型转换处理。该转换的主要代码实现如下所示:
void CMainFrame::OnSendData(CString m_strInputData,int kind) { CString str,string; VARIANT strReceive;
BYTE data[256]; long i,length; COleSafeArray m_input2;
length=m_strInputData.GetLength(); //将Cstring型变量转换为BYTE型数组 for(i=0;i<length;i++) data[i]=m_strInputData.GetAt(i);
length++; //创建一个ColeSafeArray型变量数组 m_input2.CreateOneDim(VT_UI1,length,data,0);
//把字节数组转换成ColeSafeArray型变量 for(i=0;i<length;i++) m_input2.PutElement(&i,data+i); //把ColeSafeArray型变量转换成VARIANT型变量 strReceive=m_input2; //发送数据 m_commctrl.SetOutput(strReceive); } |
我们知道,每个使用的串口通信控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个控件。通常,PC机配有两个串行接口,分别以COM1和COM2标称。所以如果需要在同一应用程序中,对两个接收机进行遥控时,就可以通过创建两个串口通信控件来实现。并且PC机也可以根据需要添加新的串行接口硬件,所以通过多个串口通信控件就能很容易地实现与多个外部设备的通信。
五、 结束语 本文实现了在windows98下用Visual C++来开发某侦察接收机与PC机串行通信的接口程序,并且利用ActiveX控件大大简化了程序设计的难度。本文给出了部分关键实现的代码,并根据作者开发经验,指出了需要注意的问题,具有一定的实用意义。
查看本文来源