VC++串口通信详解
串口通信-MSComm控件使用详解

串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
VC++ msscom串口编程-十六进制--二进制发送接受数据

visual c++/vc/vc6/vs2003/vs2005 msscom串口编程-十六进制/二进制发送、接受数据2008-12-24 00:46首先,要注意vs2003下跟vc6的接口不一样(名字变化很有规律,请看前文)。
另外,MSComm里用到的VARIANT, COleVariant类型与CString, BYTE之间的转换,以实现数据的发送和接收。
CString与int的转换,实现对接收来的数据的运算。
一、MSComm和VARIANTVC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。
这两个函数的参数都是VARIANT类型。
void CMSComm::SetOutput(const VARIANT& newValue)VARIANT CMSComm::GetInput()发送过程:VARIANT其实是一个C++结构类型,COleVariant类型对VARIANT做了进一步的封装和扩展,提供了许多新的功能和操作方法,支持OLE自动化,且更容易向其数据成员填入数据。
由于COleVariant类型由VARIANT派生而来,因此将COleVariant类型的变量传递给SetOutput函数更为方便。
另外,SetOutput的参数newValue类型必须是存放字节类型数据的动态数组。
因此,可以利用Visual C++提供CByteArray类型来构造COleVariant类型的对象,并将其传递给SetOutput函数。
对CByteArray类型变量的操作相对来说要容易的多,比如其成员函数SetSize可用来设置动态数组的大小,下标操作符[]可用来为其元素赋值等等。
下面的程序代码可实现将存放在缓冲区strBuf中的100个字节的数据通过通讯控件发送出去:……BYTE strBuf[128];CByteArray OutBuf;COleVariant varOutput;……OutBuf.SetSize(100);for(i=0;i<100;i++)OutBuf[i] = strBuf[i];//BYTE转CByteArrayvarOutput = OutBuf;//CByteArray转COleVariantm_pCommDlg->m_Comm.SetOutput(varOutput);……或者使用OutBuf.add添加字符。
利用VC++串口通信实现有线电视网络的自动巡回监测

作者简介: 潮(97一 ) 张 17 ,男, 硕士研 究生 , 助理工程师 , 主要研 究方向为计 算机通信、 网络管理, .a : aglo ca@ 16cm; E m i z ncn_ho 2.o lh a 张眷利(98 ) 男, 1 一 , 硕士研 究生, 7 主要研究方向为电子政务 , 从事实验室管理工作。
3 结 束 语
开发的网络数据监测管理软件以 S LSr r Q e e作为后台 v 数据 库 , 利用 Vsa C++强 大 的可视 化 编程 功 能 , i l u 来 实现 有线 电视 网络监测数 据 的接 收 、 理 、 处 存储 、 查询 、 报警 和故 障定 位等 功能 。有线 电视 网络数 据监测 管理
[ ] 吕海寰. 1 卫星通信 系统[ . M] 北京: 民邮 电出 人
版 社 ,9 4 19 .
[ ] 方德葵. 2 卫星数字传输与微波技 术[ . M] 北京: 中国广播 电视 出版社 ,0 5 20 . [ ] 王 明 臣, 盈 昀. 3 杨 电视 节 目制 作 与 多媒 体技 术 [ . 京: M] 北 中国广播 电视 出版社 ,97 19 . [ 收稿 日期 :00( .6 2 1-32 ] )
软件主要用于监测有线电视 网络 中传输的有线电视信 号 , 过对 电视 信 号 的载 波 、 通 音频 、 视频 等 指标 的实 时 监测 , 时发现 前端 机 房 及 网络 故 障 , 发 出报 警 , 及 并 使 网络 维护人 员 能及 时 准确 地排 除故 障 , 保证 用 户 正 以 常收 视 , 一步 保证 网络 运 营商 的利 益 。 进 1 串 口通 信技 术 11 串 口通信 方法 . 在 MirsfWid w 下 开发 串 口通信 程 序通 常有 coo n o s t 以下 几种方 法 : 一种 是 利 用 M coo 公 司提 供 的 串 口 irsf t 通信 组 件 , A te 控 件 Mi oo o muiaos 如 cvX i c sf C m nctn r t i Cnrl另一 种是 利 用 Widw ot ; o no s的 读 写 函数 一n 、 i— ip 一n p 、 np w 一i d、 ot、 ot 或 开 发 驱 动 程 序 ( no s up 一 up w Widw N T系 列 下 ) 直 接 对 串 口进 行 操 作 ; 三 种 是 利 用 第 Widw P 通信 函数 , 有 就 是 利 用 第 三 方 或 自己 nos I A 还 编写 的 串 口通 信类 。 12 串 口通信 方法 比较 . 使用 A t e 控 件 MS o 方法 较 为 简 单 , 需 cvX i Cmm 只 要 对 串 口进 行 简 单 的 配 置 , 比较 难 的是 V RA T类 A IN 不 易 理解 , 付简 单 的任 务 完 全 可 以 , 是 当需 要 在 对 但 程序 中使用 多个 串 口, 且还 要做 很 多复 杂 的处理 时 , 而 最 好不 用 MS o m 通讯 控件 ; 二 种 方 法 需 要 了解 硬 Cm 第 件 电路结构 原 理 , 入 驱 动 层 次 , 业 化 程 度 较 高 ; 深 专 第 三种方 法使 用 面较 广 , 比较 复 杂 , 用 较 困难 ; 后 一 使 最 种方 法 只要 理 解 串 口通 信 类 的几 个 成 员 函数 , 可 以 还 根据 不 同的需 要修 改成 员 函数 , 用 较为 方便 、 活 。 使 灵
利用MSCOMM串口通信控件进行异步串行通信的VC程序设计

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计一课程设计题目利用MSCOMM串口通信控件进行异步串行通信的VC程序设计二课程设计要求●环境要求:Windows95/98/2000/XP●功能要求:能将键盘上输入的数据发送到另一台计算机上;能将接收到的数据显示到屏幕窗口内;了解常用通信网络设备的操作和应用,掌握常用的通信协议的工作原理,能利用Visual C++、开发工具完成相应的通信程序的设计工作。
学习简明地介绍自己的设计工作。
三课程设计目的用Visual C++编程工具主机提供的接口,解决网络用户之间的交互式对话问题。
进一步深入掌握网络设计和通信程序的设计原理。
使学生对计算机通信网络的设计实现有较深的了解,培养较高的通信网络设计能力。
四程序思路硬件连接方面:数据的发送和接收由软件控制,不进行硬件握手,其连接方法如图真正需要互相连接的是RXD、TXD和GND;软件方面:串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。
使用非常方便。
⑴.在当前的Workspace中插入MSComm控件。
Project菜单------>Add to Project---->Components and Controls----->RegisteredActiveX Controls--->选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。
基于VC++的吊放声纳模拟训练台串口通信实现

金立 峰
( 海军飞行学院 辽 宁葫芦岛 15 0 ) 20( /
摘要: 用模拟训练 器材能 大幅提 高反 潜训练效能 。 用v + 的Ms o 利 利 c+ c mm控件可方便迅 速 的实 控制计算机 与模 拟器终端的 串口 现 通信, 能够满
—
sre .oma(%c '1 , ttmpF r t ” ) , ” b ; 将字符送入临时变量sre 存放 ttmp S TRRDa a = t t mP , 人 接 收编 辑 框 对 应 字 符 串 t + s e :,加 r
}… … }
f稻 环 中的语句对信息的获取很重要 ,上位机和下位机通信 o 都有 自己的协议和格式 ,每一位都代表着不同的含义 ,包括 :信 号灯的燃亮 ,开关 、旋钮的位置 ,各种灯键 、按钮的状态等等。 K 不同 ,就能得 到下位机返 回信息 中不同位置包含 的信息 ,对 值 应 的可以判 断出下位机 的响应状态 ,判断 是否 正确 ,同时获得有 用 的相 关 信 息 。 1 打开 串 口和设置 串口参 数 . 4 串 口的打开 时机很灵 活 ,可 以在 程序 中做一 个打 开串 口按 钮 ,在 该 按 钮 的单 击 响应 函 数 中 打开 串 口 。也 可 以 在 主对 话 框 的 初 始 化 函 数 中 打 开 串 口 ,加 入 如 下 代 码 (): 打 开 cls W ia d一> mb rVi ra l 项 卡 ,选 择 as zr Me e a i b e 选 s f ……m crC mm s t o — tl o .ec mmP r( ;, 0t ), n 选择打 开第 n 串E 个 l CS mmT Dl类 ,为 I — C Co et g s DC MS 0MM1 加 控 制 变 量 :m— 添 i ! c lo m.eP r pn ) f m_tC m G tot e0 ( r O crC mm,这 时 你 可 以看 一 看 ,在 对 话 框 头 文 件 中 自动 加 入 了 / t o l , m e l mm. t r 0Pe TRuE)/ 打 开 串 E t 0 rC S P0 t e n( ;/ l { F _N L D S #nld “ cm h /}F _N L D S { X I C U E 0 ic e mso m.” / A X I C U E 。 A u } el e f M s a A x e geBOX - i t Pe r r! ” ; s s ( Ser alPOr o n er o I )
串行通信的基本原理

本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC 实现串口(COM)通信的方法:使用ActiveX控件或Win API.并给出用Visual C++6.0编写的相应MFC32位应用程序。
关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。
计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。
实际工作中利用串口完成通信任务的时候非常之多。
已有一些文章介绍串口编程的文章在计算机杂志上发表。
但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。
笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。
希望对各位需要编写串口通信程序的朋友有一些帮助。
一.串行通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口通信程序的流程如下图:二.串口信号线的接法一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。
25芯和9芯的主要信号线相同。
以下的介绍是以25芯的RS-232C为例。
①主要信号线定义:2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR; 8脚:数据载波检测DCD;1脚:保护地; 7脚:信号地。
TMS320VC5416与89C51的串行通信设计
M BP c S 。每个 Mc S B P在结构上分 为一个 数据通道 和一个控制通道。数据通道负责完成数据的发送和
接收, 由于 Mc S B P的 接 收操 作 采 用 3级 缓 冲 方 式 ,
发送操作采用 2 级缓冲方式 , c S M B P支持 片内数据 搬移和外部数据通信的同步进行 。控制通道负责内
h岫 啊醴 : p l a o f I S 2 VC 41 .i o e e d o o I a pi t n o M 3 0 5 6 t f n n e s t c mmu iae wi h C n ci t nc t t te M U.q e r ce ic s e h w o e p 1 h h at l ds u s s o t x a d i ]
款高性能 1 位定点 D P 具有计算能力强 、 6 S, 运算 速度快 、 性价 比高的特点 , 同时它也有控制能力较 但
一
1 .
2 V 5 1 B P的 特点 O C 4 6Mc S
C 4 6具 有 3个 高速 、 51 全双 工 、 通道 缓 冲 串 口 多
弱 的不 足 , 而 在 C 4 6的应 用 中 , 常 使 用 单 片 因 51 经
LUO - u Da h i
( eto C m ̄ e D p. f o l r ̄i n ehoo yC ag ̄uC l g fnomao ehoo , hnzo 1 14 C i ) e adTcnlg, hnz me ol eo I r t nTcnlg C ag u2 3 6 , h a e f i y h n
维普资讯
第6 卷
第3 期
常
州
信
vc与西门子plc网口通讯dll
vc与西门子plc网口通讯dll 近年来,随着工业自动化的快速发展,PLC(可编程逻辑控制器)成为了现代工业生产中不可或缺的重要设备。
而VC(Visual C++)作为一种广泛应用于软件开发领域的编程语言,与PLC的通讯实现了无缝对接。
而在VC与西门子PLC的网口通讯中,DLL(动态链接库)的作用尤为重要。
一、VC与PLC的通讯在PLC的控制系统中,PLC通过采集传感器和执行器的信号,进行逻辑运算,并通过输入输出口与外部设备进行通讯,实现对工业生产过程的控制。
而VC作为一种功能强大且灵活的编程语言,可以与PLC进行通信,并实现对其进行监控和控制的功能。
二、PLC网口通讯DLL的作用为了实现VC与PLC的通讯,需要使用网口通讯DLL。
DLL 是一种可被多个程序共享的动态链接库文件,用于实现程序之间的交互和功能调用。
在VC与PLC的通讯中,通过调用PLC网口通讯DLL中的函数,可以实现与PLC之间的数据交换和控制命令的传递。
三、西门子PLC网口通讯DLL的特点西门子PLC是行业中最为常见和广泛应用的PLC品牌之一。
其网口通讯DLL具有以下特点:1. 高性能:西门子PLC网口通讯DLL采用低层次的通讯协议,可以实现高速的数据传递和响应。
2. 稳定可靠:经过多次实践和测试,西门子PLC网口通讯DLL具有较高的稳定性和可靠性,能够满足各种复杂工业环境下的需求。
3. 易于使用:通过简单的函数接口,VC程序员可以轻松调用PLC网口通讯DLL中的功能,实现与PLC的通讯。
四、VC与西门子PLC网口通讯DLL的应用VC与西门子PLC网口通讯DLL的应用十分广泛。
以某工厂的生产线为例,生产线上的多个PLC设备需要与VC软件进行通讯,实现对生产过程的监控和控制。
通过调用西门子PLC网口通讯DLL中的函数,VC软件可以获取PLC的数据,实时显示在界面上,并根据需求下发控制命令,实现对生产线的自动控制。
五、VC与西门子PLC网口通讯DLL的开发为了实现VC与西门子PLC的通讯,需要进行相应的DLL开发。
LabWindowsCVI串口通信函数
LabWindows/CVI串口通信函数LabWindows/CVI提供的RS-232函数库主要包括以下几类函数:串行口打开/关闭 (Open/Close)函数,串行口输入/输出(Input/Output)函数,串行口控制(Control)函数,串行口状态查询(Status)函数和串行口事件处理(Callbacks)函数。
下面分别予以介绍。
1.串行口打开/关闭函数1)OpenCom函数功能:表示以默认的参数设置方式打开一个串口。
该函数原型为:int OpenCom (int COM_Port,char Device_Name[ ] )其中,参数COM_Port为整型变量,用于指定串口号,有效范围为1~1000;Device_Name[]为字符型数组,是用ASCⅡ码字符串表示的串口名。
2)OpenComConfig函数功能:用来打开一个串行口并进行相关的参数设置。
该函数原型为:int OpenComConfig(int COM_Port,char Device_Name[],long Baud_Rate,int Parity,int Data_Bits,int Stop_Bits,int Input_Queue_Size,int Output_Queue_Size)其中,参数COM_Port为整型变量,用于指定串口号,有效范围为1~1000;Device_Name[]为字符型数组,是用ASCⅡ码字符串表示的串口名。
例如,以“COM1”来代替端口1,如果输入值为NULL或一个空字符串,则以COM_Port号作为指定端口号。
Baud_Rate为长整型变量,用来设置串行口的传输速率,标准的传输速率有110、300、600、1200、2400、4800、9600、19200b/s等;默认值为9600。
Parity为整型变量,用来指定奇偶校验模式。
0表示无奇偶校验,1表示奇校验,2表示偶校验;Data_Bits为整型变量,用来指定每帧信息中数据位的个数,可选5、6、7、8;Stop_Bits为整型变量,用来指定每帧信息中停止位的个数,可选1、1.5或2;Input_Queue_Size为整型变量,用来指定串行口输入队列的大小;Output_Queue_Size为整型变量,用来指定串行口输出队列的大小。
串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++串口通信详解串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
本文以VC++为平台进行串口通信编程串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式串行通信的操作方式1.同步方式同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回MTIMEOUTS timeOver;//COMMTIMEOUTS结构用于设置读写函数的等待时间。
2.memset(&&timeOver,0,sizeof(timeOver));3.DWORD timeMultiplier,timeConstant;4.timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;5.timeOver.ReadTotalTimeoutConstant=timeConstant;6.SetCommTimeouts(hComport,&&timeOver);7.……8.ReadFile(hComport,//串口句柄9. inBuffer,//缓冲10. nWantRead,//每次调用ReadFile时,函数试图读出的字节数11. &&nRealRead,//实际读出的字节数12. NULL);//代表ReadFile将采用同步文件读写的方式如果所规定的待读取数据的数目nWantRead较大且设定的超时时间也较长,而接收缓冲区中数据较少,则可能引起线程阻塞。
解决这一问题的方法是检查COMSTAT结构的cbInQue 成员,该成员的大小即为接收缓冲区中处于等待状态的数据的实际个数。
如果令nWantRead 的值等于COMSTAT.cbInQue,就能较好地防止线程阻塞。
2.查询方式查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间,它实际上是同步方式的一种派生。
MTIMEOUTS timeOver;2.memset(&&timeOver,0,sizeof(timeOver));3.timeOver.ReadIntervalTimeout=MAXWORD;//注意和同步方式不同的地方4.SetCommTimeouts(hComport.&&timeOver);5.……6.ReadFile(hComport.7. inBuffer.8. nWantRead.9. &&nRealRead,10. NULL);//代表ReadFile将采用同步文件读写的方式除了COMMTIMEOUTS结构的变量timeOver设置不同外,查询方式与同步方式在程序代码方面很类似,但二者的工作方式却差别很大。
尽管ReadFile采用的也是同步文件读写方式,但由于timeOver的区间超过时间设置为MAXWORD,所以ReadFile每次将读出接收队列中的所有处于等待状态的数据,一次最多可读出nWantRead个字节的数据。
3.异步方式异步方式中,利用Windows的多线程结构,可以让串口的读写操作在后台进行,而应用程序的其他部分在前台执行。
1.OVERLAPPED wrOverlapped;MTIMEOUTS timeOver;3.memset(&&timeOver.0.sizeof(timeOver));4.DWORDtimeMultiplier,timeConstant;5.timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;6.timeOver.ReadTotalTimeoutConstant=timeConstant;7.SetCommTimeouts(hComport,&&timeOver);8.wrOverlapped.hEvent=CreateEvent(NULL.TRUE,FALSE,NULL);//创建事件句柄9.……10.ReadFile(hComport,11. nBuffer,12. nWantRead,13. &&nRealRead,14. &&wrOverlapped);//异步方式并且与事件联系上15./*由于采用了异步方式,所以它只返回数据是否已开始读入的状态,并不返回实际的读入数据,即ReadFile中的nRealRead无效*/16.17.//实际读入的数据是由GetOverlappedResult函数返回的18.GetOverlappedResult(hComport,19. &&wrOverlapped,20. && nRealRead,21. TRUE);22./*表示它等待异步操作结束后才返回到应用程序,此时,GetOverlappedResult函数与WaitForSingleObject函数等效。
*/23.……24.ResetEvent(wrOverlapped.hEvent);//释放事件句柄当采用异步方式时,在用CreateFile打开串口设备时,CreateFile函数的参数fdwAttrsAndFlags必须设为FILE_FLAG_ OVERLAPPED。
在Windows中,只有在串行设备上才支持异步文件读写,并且,GetOverlappedResult函数也只支持串行设备或用DeviceloControl函数打开的文件。
4.事件驱动若对端口数据的响应时间要求较严格,可采用事件驱动方式。
事件驱动方式通过设置事件通知,当所希望的事件发生时,Windows发出该事件已发生的通知,这与DOS环境下的中断方式很相似。
Windows定义了9种串口通信事件,较常用的有以下三种:EV_RXCHAR:接收到一个字节,并放入输入缓冲区;EV_TXEMPTY:输出缓冲区中的最后一个字符,发送出去;EV_RXFLAG:接收到事件字符(DCB结构中EvtChar成员),放入输入缓冲区。
在用SetCommMask()指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件的发生。
SetCommMask(hComm,0)可使WaitCommEvent()中止。
STAT comStat;2.DWORD dwEvent;3.SetCommMask(hComport,EV_RXCHAR);//设置事件代码4./*EV_RXCHAR,表示接收到一个字符时触发这一事件,然后调用WaitCommEvent函数等待该事件的发生。
*/5.……6.if(WaitCommEvent(hComport,&&dwEvent,NULL))7.if((dwEvent&&EV_RXCHAR)&&&&comstat.cbInQue)8.ReadFile(hComport,9. inBuffer,10. comstat.cbInQue,11. &&nRealRead,12. NULL);//表示该函数是同步的第一篇初步了解串口的大致运作,接下来我们看基本操作先看串口操作的数据结构:串口操作有几个比较重要的Struct1.Overlapped I/O 异步I/O模型异步I/O和同步I/O不同,同步I/O时,程序被挂起,一直到I/O处理完,程序才能获得控制。
异步I/O,调用一个函数告诉OS,进行I/O操作,不等I/O结束就立即返回,继续程序执行,操作系统完成I/O之后,通知消息给你。
Overlapped I/O只是一种模型,它可以由内核对象(hand),事件内核对象(hEvent), 异步过程调用(apcs) 和完成端口(I/O completion)实现。
Overlapped数据结构:typedef struct _OVERLAPPED {DWORD Internal;DWORD InternalHigh;DWORD Offset;DWORD OffsetHigh;HANDLE hEvent;} OVERLAPPED, *LPOVERLAPPED;DWORD Internal; 通常被保留,当GetOverlappedResult()传回False并且GatLastError()并非传回ERROR_IO_PENDINO时,该状态置为系统定的状态。
DWORD InternalHigh; 通常被保留,当GetOverlappedResult()传回False时,为被传输数据的长度。
DWORD Offset; 指定文件的位置,从该位置传送数据,文件位置是相对文件开始处的字节偏移量。
调用ReadFile或WriteFile函数之前调用进程设置这个成员,读写命名管道及通信设备时调用进程忽略这个成员;DWORD OffsetHigh; 指定开始传送数据的字节偏移量的高位字,读写命名管道及通信设备时调用进程忽略这个成员;HANDLE hEvent; 标识事件,数据传送完成时把它设为信号状态,调用ReadFileWriteFile ConnectNamedPipe TransactNamedPipe函数前,调用进程设置这个成员. 相关函数CreateEvent ResetEvent GetOverlappedResultWaitForSingleObject CWinThread GetLastErrorOVERLAPPED和数据缓冲区释放问题:在请求时,不能释放,只有在I/O请求完成之后,才可以释放。
如果发出多个overlapped 请求,每个overlapped读写操作,都必须包含文件位置(socket),另外,如果有多个磁盘,I/O执行次序无法保证。
(每个overlapped都是独立的请求操作)。
内核对象(hand)实现:例子:用overlapped模型读一个磁盘文件内容。
1.把设备句柄看作同步对象,ReadFile将设备句柄设为无信号。
ReadFile 异步I/O字节位置必须在OVERLAPPED结构中指定。
2.完成I/O,设置信息状态。
为有信号。
3.WaitForSingleObject或WaitForMultipleObject判断或者异步设备调用GetOverLappedResult函数。
1.int main()2.{3.BOOL rc;4.HANDLE hFile;5.DWORD numread;6. OVERLAPPED overlap;7.char buf[READ_SIZE];8.char szPath[MAX_PATH];9. CheckOsVersion();10.11. GetWindowsDirectory(szPath, sizeof(szPath));12. strcat(szPath, "//WINHLP32.EXE");13. hFile = CreateFile( szPath,14. GENERIC_READ,15. FILE_SHARE_READ|FILE_SHARE_WRITE,16. NULL,17. OPEN_EXISTING,18. FILE_FLAG_OVERLAPPED,19. NULL20. );21.if (hFile == INVALID_HANDLE_VALUE)22. {23. printf("Could not open %s/n", szPath);24.return -1;25. }26.27. memset(&overlap, 0, sizeof(overlap));28. overlap.Offset = 1500;29.30. rc = ReadFile(31. hFile,32. buf,33. READ_SIZE,34. &numread,35. &overlap36. );37. printf("Issued read request/n");38.if (rc)39. {40. printf("Request was returned immediately/n");41. }42.else43. {44.if (GetLastError() == ERROR_IO_PENDING)45. {46. printf("Request queued, waiting.../n");47. WaitForSingleObject(hFile, INFINITE);48. printf("Request completed./n");49. rc = GetOverlappedResult(50. hFile,51. &overlap,52. &numread,53. FALSE54. );55. printf("Result was %d/n", rc);56. }57.else58. {59. printf("Error reading file/n");60. }61. }62. CloseHandle(hFile);63.return EXIT_SUCCESS;64.}事件内核对象(hEvent):内核对象(hand)实现的问题:不能区分那一个overlapped操作,对同一个文件handle,系统有多个异步操作时(一边读文件头,一边写文件尾, 有一个完成,就会有信号,不能区分是那种操作。