在工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
 
   本文将介绍在Windows平台下串行通信的工作机制和用Visual C++设计串行通信程序的编程方法及通信方式。
 
   VC中实现串行通信的编程技术
 
   以下我们将介绍VC中几种实现串行通信的编程技术:
 
   利用VC++的标准通信函数
 
   利用VC++的标准通信函数_inp和_outp可实现串口通信。下面是一个串口初始化的程序:
 
   void init_com(PORT)
 
   {char i;
 
   outp(PORT+3,0x80);
 
   outp(PORT,0x0C);
 
   outp(PORT+1,0);
 
   outp(PORT+3 ,0x3a);
 
   outp(PORT+3 ,0x03);
 
   i=inp(PORT+5) && 0xfe;
 
   outp(PORT+5,i);}
 
   使用串行通信控件MSComm
 
   串行通信控件MSCOmm32.OCX提供了使用RS-232来进行数据通信的所有协议,VC为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置。它使用户能够方便地访问Windows串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等。
 
   在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性。以下是通过设置控件属性对串口进行初始化的实例:
 
   BOOL CSampleDlg:: PortOpen()
 
   { BOOL m_Opened;
 
   ......
 
   m_Serial.SetCommPort(2); // 指定串口号
 
   m_Serial.SetSettings("4800,N,8,1");
 
   // 通信参数设置
 
   m_Serial.SetInBufferSize(1024);
 
   // 指定接收缓冲区大小
 
   m_Serial.SetInBufferCount(0);
 
   // 清空接收缓冲区
 
   m_Serial.InputMode(1);
 
   // 设置数据获取方式
 
   m_Serial.SetInputLen(0);
 
   // 设置读取方式
 
   m_Opened=m_Serail.SetPortOpen(1);
 
   // 打开指定的串口
 
   return m_Opened;}
 
   打开所需串口后,我们需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。
 
   使用API函数
 
   控件虽然简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信的应用场合下,控件的使用显得捉襟见肘。API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列很复杂的函数和消息集合。它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。雅思答案
 
   通信程序在CreateFile处指定串口设备及相关的操作属性,再返回一个句柄,该句柄将被用于后续的通信操作,并贯穿整个通信过程。串口打开后,其属性被设置为默认值,根据具体需要,通过调用GetCommState(hComm,&&dcb)读取当前串口设备控制块DCB设置,修改后通过SetCommState(hComm,&&dcb)将其写入。运用ReadFile()与WriteFile()这两个API函数实现串口读写操作,若为异步通信方式,两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用WaitForSingleObject()来等待结束信号并设置最长等待时间,举例如下:
 
   BOOL bReadStatus;
 
   bReadStatus = ReadFile( m_hIDComDev, buffer,
 
   dwBytesRead, &&dwBytesRead, &&m_OverlappedRead );
 
   if(!bReadStatus){
 
   if(GetLastError()==ERROR_IO_PENDING){
 
   WaitForSingleObject(m_OverlappedRead.hEvent,1000);
 
   return ((int)dwBytesRead);}
 
   return(0);}
 
   return ((int)dwBytesRead);
 
   多线程下实现串行通信
 
   Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Windows区分两种不同类型的线程,一种是用户界面线程(User Interface Thread),它包含消息循环或消息泵,用于处理接收到的消息;另一种是工作线程(Work Thread),它没有消息循环,用于执行后台任务、监视串口事件的线程即为工作线程。
 
   多线程程序的编写在端口的配置,连接部分与单线程的相同,在端口配置完毕后,最重要的是根据实际情况,建立多线程之间的同步对象,如信号灯、临界区和事件等。

基于VC的串行通信技术应用实例的更多相关文章

  1. 【转】精选30个优秀的CSS技术和实例

    今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...

  2. 精选30个优秀的CSS技术和实例

    精选30个优秀的CSS技术和实例   投递人 墙头草 发布于 2008-12-06 20:57 评论(97) 有17487人阅读 原文链接 [收藏] « » 今天,我为大家收集精选了30个使用纯CSS ...

  3. css技术和实例

    今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...

  4. CORBA技术及实例

    CORBA技术及实例 CORBA是一种规范,它定义了分布式对象如何实现互操作.在WorldWideWeb盛行之前,非凡是java编程语言风靡之前,C++开发者基本将CORBA作为其高端分布式对象的解决 ...

  5. 基于VC++的WinCE网口通信

    基于VC++的WinCE网口通信 WinCE下的网络编程与Windows下的非常类似,只是个别API函数有所不同.同样分为UDP和TCP两种,UDP就是无连接的通信,通过“用户数据报协议”(UDP)来 ...

  6. 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)

    [编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...

  7. 30个优秀的CSS技术和实例 By 彬Go 2008-12-04

    在这里可发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等…这些实例都是使用纯CSS和HTML实现的.单击每个实例的标题可以被转向到该技术实例的相关教程或说明页面(英文),单击每个实例 ...

  8. 基于三层交换机的VRRP技术--MSTP、VRRP的综合运用

    MSTP (多生成树) 每个VLAN或者几个VLAN拥有一颗生成树,基于实例的生成树.instance 1.instance 2 每个实例拥有一颗生成树.MSTP可以实现多VLAN 的负载分担,可以实 ...

  9. AutoCAD ObjectARX(VC)开发基础与实例教程2014版光盘镜像

    AutoCAD ObjectARX(VC)开发基础与实例教程2014,最新版,光盘镜像 作者:张帆 朱文俊 编著 出版社:中国电力出版社 出版时间:2014年6月 点击一下

随机推荐

  1. cgic: CGI的C函数库

    下载回源码包以后,就3个文件:cgic.c      函数库capture.c   一个很简单的CGI例子,仅仅输出两行提示文字cgictest.c  一个演示读取form表单数据的CGI例子 首先在 ...

  2. 字符串(后缀自动机):COGS 2399. 循环同构

    这道题直接看代码吧. #include <iostream> #include <cstring> #include <cstdio> using namespac ...

  3. 【动态规划】Vijos P1011 清帝之惑之顺治

    题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: ...

  4. Eclipse的快捷键及常用设置

    本篇文章转自:http://blog.csdn.net/idsunb/article/details/6604451 1.提示键配置一般默认情况下,Eclipse ,MyEclipse 的代码提示功能 ...

  5. [Locked] Flatten 2D Vector

    Problem Description: Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [ ...

  6. SRM 403(1-250pt, 1-500pt)

    DIV1 250pt 题意:称各个数位只含有4和7的数为lucky number,给定a,b,求[a, b]中的lucky number有多少个.a, b <= 10^9 解法:很明显的数位dp ...

  7. Android应用开发学习之画廊视图

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 画廊视图Gallery能按水平方向显示一组图片,并可以拖动图片.下面我们来看一个使用画廊视图的例子,其运行效果如下: ...

  8. POJ - 1170 Shopping Offers (五维DP)

    题目大意:有一个人要买b件商品,给出每件商品的编号,价格和数量,恰逢商店打折.有s种打折方式.问怎么才干使买的价格达到最低 解题思路:最多仅仅有五种商品.且每件商品最多仅仅有5个,所以能够用5维dp来 ...

  9. rsync是类unix系统下的数据镜像备份工具

    http://baike.baidu.com/view/1183189.htm   Ubuntu安装: sudo apt-get install rsync RedHat: yum install r ...

  10. Linux下一个Redis启动/关闭/重新启动服务脚本

    脚本功能: 实现redis单机多实例情况下的正常启动.关闭.重新启动单个redis实例.完毕系统标准服务的下面经常使用功能:  start|stop|status|restart 注:redis程序代 ...