MFC串口通信

MFC串口通信

 通信函数的优缺点则基本上 相反。 以下介绍的都是在单文档(SDI)应用程序中加入串口通信能力的程序。 ㈠ 使用 ActiveX 控件: VC++ 6.0 提供的 MSComm 控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常 方便,但可惜的是,很少有介绍 MSComm 控件的资料。 ⑴.在当前的 Workspace 中插入 MSComm 控件。 Project 菜单>Add to Project>Components and Controls>Registered ActiveX Controls>选择 Components: Microsoft Communications Control, version 6.0 插入到当前的 Workspace 中。 结果添加了类 CMSComm(及相应文件:mscomm.h 和 mscomm.cpp )。 ⑵.在 MainFrm.h 中加入 MSComm 控件。 protected: CMSComm m_ComPort; 在 Mainfrm.cpp::OnCreare()中: DWORD style=WS_VISIBLE|WS_CHILD; if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){ TRACE0("Failed to create OLE Communications Control\n"); return -1; } ⑶.初始化串口 m_ComPort.SetCommPort(1); //选择 COM? // fail to create

    m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes// if(!m_ComPort.GetPortOpen()) //打开串口

    m_ComPort.SetPortOpen(TRUE); m_ComPort.SetInputMode(1); //设置输入方式为二进制方式 m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数 m_ComPort.SetRThreshold(1); //为 1 表示有一个字符引发一个事件 m_ComPort.SetInputLen(0); ⑷.捕捉串口事项。 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() ⑸.串口读写. 完成读写的函数的确很简单,GetInput()和 SetOutput()就可。两个函数的原型是: VARIANT GetInput();及 void SetOutput(const VARIANT& newValue);都要使用 VARIANT 类型(所有 Idispatch::Invoke 的参数和返回值在内部都是作为 VARIANT 对象处理的)。 无论是在 PC 机读取上传数据时还是在 PC 机发送下行命令时,我们都习惯于使用字符串的形式(也可以说 是数组形式)。查阅 VARIANT 文档知道,可以用 BSTR 表示字符串,但遗憾的是所有的 BSTR 都是包含 宽字符,即使我们没有定义_UNICODE_UNICODE 也是这样! WinNT 支持宽字符, 而 Win95 并不支持。 为解决上述问题,我们在实际工作中使用 CbyteArray,给出相应的部分程序如下: void CMainFrame::OnCommMscomm(){

    VARIANT vResponse;

    int k;

    if(m_commCtrl.GetCommEvent()==2) { k=m_commCtrl.GetInBufferCount(); //接收到的字符数目 if(k>0) { vResponse=m_commCtrl.GetInput(); //read SaveData(k,(unsigned char*) vResponse.parray->pvData); } // 接收到字符,MSComm 控件发送事件 } …… // 处理其他 MSComm 控件 } void CMainFrame::OnCommSend() { …… // 准备需要发送的命令,放在 TxData[]中 CByteArray array; array.RemoveAll(); array.SetSize(Count); for(i=0;i<Count;i++) array.SetAt(i, TxData[i]); m_ComPort.SetOutput(COleVariant(array)); // 发送数据 } 请大家认真关注第⑷、⑸中内容,在实际工作中是重点、难点所在。 ㈡ 使用 32 位的 API 通信函数: 回到页顶

    可能很多朋友会觉得奇怪:用 32 位 API 函数编写串口通信程序,不就是把 16 位的 API 换成 32 位吗?16 位的串口通信程序可是多年之前就有很多人研讨过了…… 此文主要想介绍一下在 API 串口通信中如何结合非阻塞通信、多线程等手段,编写出高质量的通信程序。 特别是在 CPU 处理任务比较繁重、与外围设备中有大量的通信数据时,更有实际意义。 ⑴.在中 MainFrm.cpp 定义全局变量

    HANDLE HANDLE

    hCom; // 准备打开的串口的句柄 hCommWatchThread ;//辅助线程的全局函数

你可能喜欢

  • 串口通讯
  • 串口编程
  • 串口通信编程
  • MFC入门
  • 电子元器件图片
  • Java串口
  • c++经典代码大全

MFC串口通信相关文档

最新文档

返回顶部