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++经典代码大全
- 串口通讯一些问题1页
- 串口通讯-单片机向电脑发送数据2页
- VC串口通讯6页
- 串口通讯相关知识36页
- VB中串口通讯的实现3页
- C51串口通讯4页
- 基于MatlabGUI的串口通信编程实现4页
- Delphi 串口 通信 编程10页
- C#中串口通信编程2页
- 上位机串口通信编程51页
- PC与PLC的串口通信及编程实现4页
- 《Visual C++ Turbo C串口通信编程实践(第2版)》串口通信初学者学习方法建议2页
- MFC控件入门到精炼99页
- MFC入门教程doc75页
- VC MFC入门教程85页
- MFC入门系列五2页
- MFC入门系列四4页
- MFC入门系列二2页
- 常用电子元器件图片(3)4页
- 电子元器件识别(含图片)85页
- 常见电子元器件的识别(图片)17页
- 常用电子元器件图片18页
- 常用电子元器件图片4页
- 常用电子元器件图片18页


