下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、、引言当我们在Windows操作系统下开发串行通信程序时通常不得不面对许多复杂的API函数,因为在Windows操作系统下不能直接对设备端口进行操作,也不能在系统级(Ring3级别)使用任何或BIOS中断,如要对端口进行编程则只能以文件的形式来对端口进行操作,这就使开发人员不得不面对非常烦琐的API函数编程。本文对此提出了另外一种圭寸装性很好的使用MicrosoftVisual6.0自带的MicrosoftCommunicationsControl,version6.0ActiveX控件的编程方法,通过对该控件的正确使用,我们可以比较轻松地编写出所需的串行通信程序。下面,我们将结合一个实际的程
2、序示例来对此方法进行说明。本程序的编程环境是Windows98和MicrosoftVisual6.0。在本程序示例中对为避免阻塞而对线程的使用以及在使用中遇到的一些问题也做了详细的介绍。二、程序的设计实现在开始进行代码编程前,首先以在工程中插入组件或控件的方式将ActiveX控件MicrosoftCommunicationsControl,version6.0加入到工程中来,此时将会在工程中添加一个关于此控件的新类。使用该控件的一些方法和属性时不能象使用类一样简单的声明一个实例对象,而要通ClassWizard为该控件和一个成员变量建立起绑定关系,在此我们将该控件同变量m_Comm相绑定后就可
3、以通过该控件提供的方法来对串口的各种通讯参数进行设置了。为了编程方便起见,也可以在资源视图中直接对该控件的属性进行设置,如无特别要求,对下表所列属性进行设置就基本可以满足编程要求了。现将常用的属性列表如下:属性设定值属性说明CommPort1串口号,一般从1到4InBufferSize30720接收缓冲区大小,为保持程序的稳定,建议设得值足够大InputMode0-Text接收数据的类型,0表示文本类型,1表示二进制类型InputLen0从接收缓冲区读取的字节数,0表示全部读取OutBufferSize512发送缓冲区大小Settings4800,n,&1串口的参数设置,依次为波特率、奇偶校验
4、(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数RThreshold1设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件SThreshold0设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件我们要求能在程序启动的同时就打开串口以便即时对从串口到达的数据进行接收、处理。一般来说可以将下面的打开端口的代码写在OnCreate()、OnInitialUpdate()、InitInstance()等程序入口函数中:if(!m_Comm.GetPortOpen()/
5、检测是否已经打开过端口m_Comm.SetPortOpen(TRUE);/如没有打开则将端口打开接下来的工作就是对数据的发送与接收了,这也是本文所要介绍的重点所在。发送数据的代码原则上是可以写到一个成员函数中被直接调用的,但这并不是一个良好的编程习惯:我们应当把比较耗时的操作,如文件拷贝、打印、端口传输等工作放到一个单独的线程当中,以避免其在工作时会引起整个进程的阻塞,以提高整个系统对CPU的利用率。例如我们可以在视类中菜单或按钮的响应函数中用AfxBeginThread(WriteProc,this)函数来开启一个名为WriteProc的线程,由于在线程中还需要使用视类的函数和变量,为了不产
6、生新的视类的实例对象,我们通过该函数的第二个参数将指向当前的视类的指针this作为参数传递给线程。在线程中可以用如下两种方法之中的一种调用视类的成员函数:(COLECommView*)pParam)-DoSendProc();或是:COLECommView*view=(COLECommView*)pParam;View-DoSendProc();其中从pParam传来的变量就是指向视类的指针。在线程中通过调用视类中的DoSendProc函数来完成对数据的发送,正是由于该函数是被全局的线程所调用的,我们就不可以使用取编辑框上的数据时通常所用的UpdateData函数了,取而带之的是API函数Ge
7、tDlgItemText(),取到输入的数据后通过控件的SetOutput()方法就把数据从串口发出去了,其中发送数据必须经ColeVariant类将其转换为通用的VARIANT型变量。实现主要代码如下:chara255;HWNDhwnd=GetSafeHwnd();:GetDlgItemText(hwnd,IDC_EDIT1,a,255);inti=0;CStringstr;while(ai!=0)str.Format(%c,ai);m_SendData+=str;i+;str.Format(%c,10);m_SendData+=str;m_Comm.SetOutput(COleVarian
8、t(m_SendData);至于数据的接收,我们可以通过让MSComm控件响应其OnComm事件来完成,通过ClassWizard加入其对事件的响应后,通过下面的事件映射,当有字符到达时便会通知OnComm()函数去处理,从而实现数据的异步接收:BEGIN_EVENTSINK_MAP(COLECommView,CFormView)/AFX_EVENTSINK_MAP(COLECommView)ON_EVENT(COLECommView,IDC_MSCOMM1,1/*OnComm*/,OnComm,VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()voi
9、dCOLECommView:OnComm()VARIANTInput;if(m_Comm.GetCommEvent()=2)接收缓冲区内有字符Input=m_Comm.GetInput();读取缓冲区内的数据CStringmsg=Input.bstrVal;CStringstr;str.Format(%c,10);if(msg.Right(1)=str)m_RecvData+=msg;m_History.AddString(m_RecvData);m_RecvData=;elsem_RecvData+=msg;当数据被接收到接收缓冲区后,对于字符可以从VARIANT型结构变量的bstrVal成员变量中获取,VARIANT数据结构相当复杂,并牵扯到COM(ComponentObjectModel,组件对象模型)中的一些概念,具体详情请参阅MicrosoftCorpration发布的MSDN中的有关论述。三、测试与实验编译运行程序之前有必要对机器的端口做一番检查,以确保端口的完好,可以用常见的程序Comdebug来检查。在确认串口工作正常后,可用串口线将两台机器的串口相连,同时在两台机子上运行该程序,如果没有条件也可只用一台微机,将其串口的2脚和3脚短接,使其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-新疆-新疆收银员二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-新疆-新疆保安员四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西水生产处理工一级(高级技师)历年参考题库含答案详解
- 【新教材】统编版(2024)七年级上册道德与法治期末学情测试卷(含答案)
- 2026年贵州省赤水市高三生物下册期末考试模拟考试卷(含答案)
- 2026年四川省江油市高三物理下册期末考试模拟测试卷(含答案)
- 2026年广东省陆丰市高三生物下册期末考试模拟试卷含答案
- 2026年云南省蒙自市高三生物下册期末考试模拟卷(含答案)
- 2026年吉林省公主岭市高三生物上册期末考试模拟卷含答案
- 2026年校招:岭南集团笔试题及答案
- 企业薪酬激励制度设计与实施案例
- 江西省2018-2024年中考满分作文121篇
- 城市更新项目的房地产营销方案
- 地氟烷的临床应用
- 鼠疫相关知识培训课件
- 围手术期疼痛管理新进展
- 19G522-1钢筋桁架混凝土楼板图集
- 第一章地球的运动(易考易错单元卷)(解析版)
- 2024年1月自考07484社会保障学试题及答案含解析
- 医疗废弃物无害化处理与资源化利用
- 《运动技能学习与控制》考试复习题库(含答案)
评论
0/150
提交评论