Win32API 异步串口通讯

合集下载

WIN32 API串口通信

WIN32 API串口通信

WIN32 API串口通信掌握串行通信API函数的用法是掌握串行通信编程技术的关键。

在Win32中,系统将串行口与文件统一了起来,对它们的打开、读写、关闭等操作都使用相同的API函数,但是它们之间又有差别,这些差别主要体现在API函数中部分参数的设置上。

有关通信的API主要包括打开串口、关闭串口、配置串口、设置缓冲区、设置超时、事件驱动、读串口、写串口等。

串口的打开和关闭1:串口的打开。

由于在Windows环境中,串口作为一种文件来使用,打开串口用打开文件同样的API函数CreateFile()。

函数原型为:HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 其中几个参数的含义分别为:lpFileName指定文件名或设备名,串口通讯时,它必须是“COMx”,其中的“x”为串口编号,如第一个串口则为“COM1”;dwDesiredAccess为串口读写属性;dwShareMode指定该端口的共享属性,串行口不能作为共享设备,故参数值必须为0;lpSecurityAttributes为安全属性,对于串口应该为0 ;dwCreationDisposition指文件的创建模式,对于串口必须为OPEN—EXISTING;dwFlagsAndAttributes描述了创建文件的其它属性,对于串行口,有效的设置只能是FILE-FLAG-OVERLAPPED 或者0,分别表示异步或同步读写;参数hTemplateFile必须为NULL。

返回值:若成功,返回创建的句柄;否则返回INVALID—HANDLE—VALUE。

win32API串口通信

win32API串口通信

WIN32API--串口通信[源码]serial.cpp vc++6.0#include<stdio.h>#include<stdlib.h>#include<windows.h>HANDLE hComm;OVERLAPPED m_ov;COMSTAT comstat;DWORD m_dwCommEvents;/*注意:在异步通信时不用等到I/O操作完成后函数才返回异步可以更快的响应用户操作;同步,相反,响应的I/O操作必须完成后函数才返回,否则阻塞线程*/bool openport(char *portname)//打开一个串口{//创建串口句柄hComm = CreateFile(portname, //设备名GENERIC_READ | GENERIC_WRITE, //指定可对串口进行读写0,//串口不能共享0,OPEN_EXISTING, //定义文件创建方式FILE_FLAG_OVERLAPPED, //设定为异步通信方式0);//模板文件句柄 0:串口无模板if (hComm == INVALID_HANDLE_VALUE)return FALSE; //串口打开不成功INVALID_HANDLE_value(0XFFFFFFFF)。

elsereturn true; //串口打开成功}/*设置串口在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。

这需要通过一个DCB结构来进行。

DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。

在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。

第一次打开串口时,串口设置为系统默认值,函数GetCommState和SetCommState可用于检索和设定端口设置的DCB(设备控制块)结构。

该结构中BaudRate、ByteSize、StopBits和Parity字段含有串口波特率、数据位数、停止位和奇偶校验控制等信息。

用Win32 API 实现串行通信

用Win32 API 实现串行通信

用Win32 API 实现串行通信南京航空航天大学牛新庄--------------------------------------------------------------------------------串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。

我们可以利用Windows API 提供的通信函数编写出高可移植性的串行通信程序。

在Win16中,可以利用OpenComm、CloseComm和WriteComm等函数打开、关闭和读写串口。

但在Win32中,串口和其他通信设备均被作为文件处理,串口的打开、关闭和读写等操作所用的API函数与操作文件的函数相同。

可通过CreateFile函数打开串口,通过CloseFile函数关闭串口,通过CommProp、DCB结构、GetCommProperties、SetCommProperties、GetCommState及SetCommState等函数设置串口状态,通过函数ReadFile和WritFile读写串口。

VC++ 6.0是Windows应用程序开发的主流语言之一,它具有良好的图形设计界面并支持面向对象的程序设计方法。

本文结合一个实例介绍在VC++ 6.0下如何利用Win32 API 实现串行通信程序。

实现原理本文的实例来自一个水泥发货系统,在系统中,需要将通过总量传感器采集到的仓重值传入到计算机中,以便系统做出相应的处理。

这需要使用串行通信来完成采集数据的传递工作。

对于串行通信设备,Win32 API支持同步和异步两种I/O操作。

同步操作方式的程序设计相对比较简单,但I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束。

异步操作方式相对要复杂一些,但它可让耗时的I/O操作在后台进行,不会挂起调用线程,这在大数据量通信的情况下对改善调用线程的响应速度是相当有效的。

异步操作方式特别适合同时对多个串行设备进行I/O操作和同时对一个串行设备进行读/写操作。

【免费下载】WIN32 API串口通信编程实例教程

【免费下载】WIN32 API串口通信编程实例教程

WIN32 API串口通讯实例教程第一节实现串口通讯的函数及串口编程简介API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。

常用函数及作用下:函数名作用CreateFile 打开串口GetCommState 检测串口设置SetCommState 设置串口BuilderCommDCB 用字符串中的值来填充设备控制块GetCommTimeouts 检测通信超时设置SetCommTimeouts 设置通信超时参数SetCommMask 设定被监控事件WaitCommEvent 等待被监控事件发生WaitForMultipleObjects 等待多个被监测对象的结果WriteFile 发送数据ReadFile 接收数据GetOverlappedResult 返回最后重叠(异步)操作结果PurgeComm 清空串口缓冲区,退出所有相关操作ClearCommError 更新串口状态结构体,并清除所有串口硬件错误CloseHandle 关闭串行口用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。

API编写串口,过程一般是这样的:1、创建串口句柄,用CreateFile;2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数;4、读写结束后,要关闭串口句柄,用CloseFile。

下面依次讲述各个步骤的过程。

第二节创建串口句柄打开串口从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(EXSITING),而且在调用CreateFile的时候请注意它的参数。

Windows 32 API在串口通信中的应用

Windows 32 API在串口通信中的应用
杨 洁
( 坊 学 院 , 山东 潍
潍坊
2 16 ) 6 0 1

要 :本 文分析 了Wi o s n w 环境 下 串行通信 的编程技 术 ,并介绍 了在用v + d c +语 言编 写
P C机与单片机 串行通信程序 实现 ,提 出了在实际应用中提 高串行通信性能的方法。 关键词:V + ;Wi 2 P 函数;串行通信;单 片机 c+ n AI 3
维普资讯
第6 卷第4 期
20 0 6年 7月
潍坊学院学报
J u a f W e fn ie s o m l i a Un v ri o a
VO . No4 1 . 6
J1 0 6 u. 0 2
Widw 2 P 在 串E通信 中的应用 no S I 3A l
Mioo c s ̄公 一 的 V + 6 r J C + . 一 种 高级 编 程 语 数据景 的实时通信,大大提高 了通信 的效率,故 0是 言 ,其 基 础类 库 ( C 封 装 了Wi3AP 中 的标 奉程 序 采 用 此种 方 式 进 行 串 行通 信 ,至 于 通 信 的 MF ) n2 l 准通 信 函数 ,可 方 便 地 支 持 串 口通信 。 下面 就 结 可 靠性 可 以通过 软件 设 汁来 保证 。 合 实例 介 绍 在 Wi o 环 境 下 , 用VC + . : 3 串行通信程序 n ws d + 60编 与 . 串行通信 程序 的技 术及 方法 。
序处 理 。
数 、 消息 的集 合 ,它 可 以看 作 是 Wi o s系统 为 n w d 在其 下运 行 的各 种 丌 发 系 统 提供 的 丌放 式 通用 功
在Widws中 , 串行 通 信 有 两 种 T 作 方 式 : no

Win32 API串口编程2

Win32 API串口编程2

Win32Win32Win32Win32APIAPIAPIAPI串口编程串口编程串口编程串口编程串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。

同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论那种操作方式,一般都通过四个步骤来完成:(1)打开串口(2)配置串口(3)读写串口(4)关闭串口打开串口打开串口打开串口打开串口Win32系统把文件的概念进行了扩展。

无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。

该函数的原型为:HANDLE CreateFile( LPCTSTR lpFileName,DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;hTemplateFile:对串口而言该参数必须置为NULL;同步I/O方式打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom=CreateFile("COM1", //COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL, OPEN_EXISTING, //打开而不是创建0, //同步方式NULL); if(hCom==(HANDLE)-1) { AfxMessageBox("打开COM失败!"); return FALSE;} return TRUE; DWORD wCount=100;//璇诲彇鐨勫瓧鑺傛暟B重叠I/O打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom =CreateFile("COM1", //COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL, OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式NULL); if(hCom ==INV ALID_HANDLE_V ALUE) { AfxMessageBox("打开COM失败!"); return FALSE; } return TRUE;配置串口配置串口配置串口配置串口在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。

基于Windows API的异步串口通信软件设计

基于Windows API的异步串口通信软件设计

龙源期刊网
基于Windows API的异步串口通信软件设计
作者:黄晓波
来源:《现代电子技术》2011年第16期
摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,在VC++6.0中利用第三方控件实现串口通信时实时性较差,系统资源利用不足,为了提高串口通信的速度和资源利用率,软件采用WindowsAPI函数并基于多线程技术和自定义消息机制的异步串口通信的设计理念,结合串口通信的机理和多线程同步技术,分析了Win32系统下多线程异步串口通信软件
的开发方法。

软件主线程是数据采集程序的管理者,串口监测线程(辅助线程)在后台对串口进行实时监视,获得了良好稳定的通信效果。

关键词:串口通信;异步(重叠)I/O;多线程;VC++
中图分类号:TN919-34;TP311 文献标识码:A 文章编号:1004-373X(2011)16-0035-04。

应用Win32 API函数开发串口通讯程序

应用Win32  API函数开发串口通讯程序

中 , 照预 定 好 的通 信 握 手 方 式 , 确 检 测 串 口状 按 正
态 , 取发 送 串 口数据 。 读
2 串 1通 讯 AP : 2 I函 数 及 编 程 机 制
2 1 串行 端 口 的 打 开 和 关 闭 .
I 0; If n t n / AP u ci o
在 Wi3 n 2中所有 的设 备都 被 看 成是 文 件 , 串行 端 口也是作 为文 件来进 行处 理 的。 串行端 口的打开
lp e ) a p d 和异 步方式 ( elp e ) Ov r p d 。下 面是 以 O e— a vr lp e a p d方式 打开 串 口的程序 片断 。
HADLE Co h mm :
无线通 讯适 配器 传送 到计算 机里 。从 而需要 控 制该
适 配器 的 收发状 态 以完成数 据 的发送 和接 收 。收发 状态 的切换 要 通过 串行 电 缆 中 R TS控 制线 的 电平 高低来 控 制 。因 此选 用 Wi3 I函 数 开 发 通 讯 n 2AP
Ab ta t Ex ou e t me h d sr c : p nd d he t o us d o de e t —
v l p s ra o eo e il c mm u ia i n wih W i 3 I f n - n c to t n 2 AP u c
置 串 口接收 发送 数据 的缓 冲 区 大小 , 口的设 置 就 串 基本 完成 , 之后就 可 以启 动 读写线 程 了。

关键 词 : 口通 讯 ; 步 I0; P 函数 串 异 / A I
中图分 类号 : 3 1 1 TP 1 . l
文献 标识 码 : A

异步方式winAPI串口通信

异步方式winAPI串口通信

使用winAPI串口通信(二)分类:Windows转载2009-09-23 16:51 263人阅读评论(0) 收藏举报采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作 ,可以明显提高程序的效率.为了实现重叠I/O操作,主要有如下几个编程步骤: 定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等.1. 定义全局变量HANDLE hCom; //串口句柄DWORD ThreadProcWrite(LPVOID pParam); //写线程函数DWORD ThreadProcRead(LPVOID pParam); //读线程函数OVERLAPPED Wol = { 0 }; //写操作OVERLAPPED结构变量OVERLAPPED Rol = { 0 }; //读操作OVERLAPPED结构变量HANDLE hThreadWrite; //写线程句柄HANDLE hThreadRead; //读线程句柄HWND hWnd; //窗口句柄2. 创建串口hCom = CreateFile ( "COM2",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式NULL );if( hCom != INVALID_HANDLE_VALUE){SetupComm(hCom,1024,512);DCB myDCB;GetCommState( hCom,&myDCB);myDCB.BaudRate=CBR_19200;myDCB.fBinary=TRUE;myDCB.fParity=TRUE;myDCB.ByteSize=8;myDCB.Parity=ODDPARITY;myDCB.StopBits=ONESTOPBIT;SetCommState(hCom,&myDCB);}else{AfxMessageBox("创建串口失败!");}hWnd = GetSafeHwnd(); //获取当前窗口的句柄3. 发出读写操作(1) 读操作在读操作中,只是启动读线程.实际的读操作在读线程函数中完成.DWORD dwThreadID;DWORD dwParam;hThreadRead = CreateThread ( NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcRead,&dwParam,0, //创建线程后,立即执行该线程&dwThreadID);if(hThreadRead==NULL){AfxMessageBox("读线程创建失败!");}CreateThread()函数用于创建一个线程.HANDLE CreateThread (//线程安全属性,NULL表示该线程不能被继承LPSECURITY_ATTRIBUTES lpThreadAttributes,//初始化栈大小.0表示默认值或按调用栈线程配置DWORD dwStackSize,//执行函数名称LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, //向新线程传递的参数DWORD dwCreationFlags, //创建标志.0表示创建后立即执行LPDWORD lpThreadId);(2) 写操作在写操作中,同样只是启动写线程.实际的写操作在写线程函数中完成.DWORD dwThreadID;DWORD dwParam;hThreadWrite = CreateThread( NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcWrite,&dwParam,0,&dwThreadID);if(hThreadWrite==NULL){AfxMessageBox("写线程创建失败!");}4.读写线程函数的建立读写的实际操作在读写线程函数中执行. 这两个函数都是全局函数.(1) 读线程函数在读线程函数中,首先应初始化重叠结构Rol的成员hEvent,将其设置为无信号状态.当读操作完成或出现通信错误时,该变量会被自动设置为有信号状态.接下来就可以使用ReadFile()函数发出读命令.若该读函数返回TRUE,说明读操作已经完成,可以处理读取的数据.若该读函数返回FALSE,说明读操作未完成.此时使用WaitForSingleObject()函数等待读操作的结构。

01 Win32 API串口通信编程

01 Win32 API串口通信编程

1、串口通信编程步骤a)打开串口b)配置串口c)读写串口d)关闭串口2、代码实例及解析a)打开串口Windows系统中对于文件的操作进行了扩充,无论是文件、通信设备、命名管道、磁盘和控制台,都是使用CreateFile函数打开或者创建。

打开串口的方式有两种——同步I/O方式打开、重叠I/O方式打开。

同步I/O方式,发出I/O操作请求的API函数将一直被阻塞,直到I/O操作完成后,才能继续向下执行,在采用多线程进行编程时,要注意避免线程被阻塞。

重叠I/O 方式,发出I/O操作请求,的API可以立即返回,系统在后台运行I/O操作,这样可以避免API函数被阻塞。

同步I/O方式打开HANDLE hCom;hCom = CreateFile(“COM1”, //串口名称GENERIC_READ | GENERIC_WRITE, //允许读写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建0, //同步方式NULL);if( hCom == (HANDLE)-1){MessageBox(“打开COM失败!”);return FALSE;}MessageBox(“打开COM成功!”);return TRUE;重叠I/O方式打开HANDLE hCom;hCom = CreateFile(“COM1”, //串口名称GENERIC_READ | GENERIC_WRITE, //允许读写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //重叠I/O方式打开NULL);if( hCom == INVALID_HANDLE_VALUE){MessageBox(“打开COM失败!”);return FALSE;}MessageBox(“打开COM成功!”);return TRUE;b)配置串口串口打开后,还要进行相应的配置,这里主要讨论:DCB配置、I/O缓冲区设置、超时设置。

WindowsAPI在串口通信中的应用

WindowsAPI在串口通信中的应用

WindowsAPI在串口通信中的应用在专门多情形下,远程监控和工业自动化领域系统经常采纳串并口通信编程,苴中串行接口被广泛地应用于工程实践的长距离通信中。

运用Windows通信API能够在Windows环境下进行串口编程,不用对硬件直截了当进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。

本文对和串口通信相关的32位Windows API函数进行了介绍,并给岀了相应的程序实例。

2Windows API 简介Win32 API 作为 Microsoft 32 位平台(包括:Windows 9x, Windows NT3.1 / 4.0/5.0, WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在 Windows平台上运行的应用程序都能够调用这些函数。

API是windows的核心,从事Windows 应用程序开发,离不开对Win32 API函数的调用。

只有充分明白得和利用API函数,才能深入到Windows 的内部,充分挖掘系统提供的强大功能和灵活性。

3Windows API相关串口通信函数介绍在32位的Windows系统中,串口通信是作为文件处理的,串口操作一样为的打开、关闭、读取、写入等操作,相应的Windows API函数如下:3.1打开和关闭串口1打开串口在Windows系统中串口通信会话以调用CreateFile ()函数开始。

CreateFile ()函数能够读写访咨询串口,并返回一个句柄,并在以后的端口操作中使用。

丄・CreateFile ()函数声明如下:2・HANDLE CreateFile(3・LPCTSTR IpszNAME, //抬定耍打开的串口逻输名4・DWORD fdwAccess, //抬定串口访咨询的类空5・DWORD fdwShareMode, //扌H左端I丨的共';•闭牛•6・LPSECURITY_ATTRIBUTES Ipsa, // 弓|用安全属性结构SECUR:ETY_ATTRHBUTES7・DWORD fdwCreate, //抬定CreateFile {)正在被已有的文件调用时应采取的描施8・DWORD fdwAttrsAndFlags, //描述端口的各种屈件9・HANDLE hTemolate描向模板文件的句柄10・)11.其中安全屈性结构SECURITY_ATTRIBUTES结构声明如下:12 . typedef struct_SECURITY_ATTRIBUTES{丄3・DWORD nLength; //抬明该结构的长度14 . LPVOID IpSecurityDescriptor; // 扌H向一个安全描述字符1.5・BOOL blnheritHandle; //讲明句柄是否能被继承丄6・}SECURITY_ATTRIBUTES;17・调用CreateFile ()函数打开COM1串口操作如下所示:丄8・HANDLE hCOM;丄9・DWORD DWeRROR;对串口 1 进行操作20. hCom=Creatfile (''COM1,,Z//2丄・GENERIC READ I GENERIC WRITE, //承诺读和写22. 0, //独占方式23・ NULL,24・ OPEN_EXTSTTNG,25. I , //重叠方式26 ・ NULL27.);28 ・ if (hCOM==TNVAL :I :D_HANDLE_VALUE)29. {30 ・ dwError=GetLastError ( ); //处理错误31・}一旦串口处于打开状态.就能够分配一个发送缓冲区和接收缓冲区•同时通过调用SetupComm()函数 实现其他初始化工作。

01 Win32 API串口通信相关函数详解

01 Win32 API串口通信相关函数详解

相关函数详解(仅牵扯到串口通信方面的)CreateFile函数——打开或创建串口HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCrationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);函数调用成功,返回串口的句柄;否则返回INVALID_HADLE_VALUE。

SetupComm函数——设置串口缓冲区大小BOOL SetupComm(HANDLE hFile,DWROD dwInQueue, //输入缓冲区大小DWROD dwOutQueue //输出缓冲区大小);设置成功后返回非0值;如果失败返回0值。

串口打开后,如果不设置缓冲区大小,系统则采用默认的大小。

设置时应当避免缓冲区溢出。

GetCommState函数、SetCommState函数Get……获得当前串口配置信息、SetCommState设置指定串口配置信息。

BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);BOOL SetCommState(HANDLE hFile, LPDCB lpDCB);GetCommTimeouts函数、SetCommTimeouts函数BOOL GetCommTimeouts(HANDL hFile, LPCOMMTIMEOUTS lpCommTimeouts);得到超时信息BOOL SetCommTimeouts(HANDL hFile, LPCOMMTIMEOUTS lpCommTimeouts);设置超时信息填充串口配置信息的方法也可用其他的方法替代,不同的函数有不同的参数规定,比如:BuildDCB填充DCB结构、BuildCommDCBAndTimeouts填充DCB和COMMTIMEOUTS,具体用法参见MSDN。

利用Win32API通信函数实现串口通信编程-地球科学与环境学报

利用Win32API通信函数实现串口通信编程-地球科学与环境学报

第26卷第3期地球科学与环境学报Vol .26No .32004年9月 Journal of Earth Sciences and Environment Sep .2004利用Win32API 通信函数实现串口通信编程李日云1,王来禄2,刘汇江3(1.长安大学地质工程与测绘工程学院,陕西西安710054;2.西安高新开发区土地储备中心,陕西西安710000;3.甘肃省公路工程总公司第五分公司,甘肃兰州730000)[摘要] 测绘仪器与计算机之间的异步串行通信是现代测绘中经常遇到的问题,如何在Windows 平台下实现测绘仪器与计算机之间数据通信是测量内、外业一体化的基本问题。

在工作经验的基础上,详细研究和分析了利用Win32API 通信函数实现串口通信编程的基本方法以及多线程技术在串口通信中的应用和特点,最后以大地型ASHTE CH GPS 接收机为研究对象,进行了相应的实验研究。

[关键词] Win32API 通信函数;串行通信;串口;多线程[中图分类号] P209 [文献标识码] A [文章编号] 1672-6561(2004)03-0061-03[作者简介] 李日云(1949-),男,山东昌乐人,工程师,现从事测绘工程实验教学与研究工作。

 [收稿日期] 2003-12-04 随着测绘仪器、测绘技术、计算机技术的快速发展,计算机与电子测绘仪器的通信问题是经常遇到的问题。

现有电子测绘仪器都采用串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。

实际工作中利用串口完成通信任务的时候很多,但结合测绘仪器在测量行业中的应用、特别是介绍32位下编程的更少且很不详细。

笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一些探讨。

32位下串口通信程序可以用两种方法实现:一是利用ActiveX 控件;二是使用API 通信函数。

使用ActiveX 控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。

win32_API串口通讯详解

win32_API串口通讯详解

WIN32API串口通讯实例教程第一节实现串口通讯的函数及串口编程简介API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。

常用函数及作用下:函数名作用CreateFile打开串口GetCommState检测串口设置SetCommState设置串口BuilderCommDCB用字符串中的值来填充设备控制块GetCommTimeouts检测通信超时设置SetCommTimeouts设置通信超时参数SetCommMask设定被监控事件WaitCommEvent等待被监控事件发生WaitForMultipleObjects等待多个被监测对象的结果WriteFile发送数据ReadFile接收数据GetOverlappedResult返回最后重叠(异步)操作结果PurgeComm清空串口缓冲区,退出所有相关操作ClearCommError更新串口状态结构体,并清除所有串口硬件错误CloseHandle关闭串行口用Windows API编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。

API编写串口,过程一般是这样的:1、创建串口句柄,用CreateFile;2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数;4、读写结束后,要关闭串口句柄,用CloseFile。

下面依次讲述各个步骤的过程。

第二节创建串口句柄打开串口从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(EXSITING),而且在调用CreateFile的时候请注意它的参数。

WindowsAPI编程控制串口

WindowsAPI编程控制串口

Windows API编程控制串口WIN32通信API基本上是一个串行端口API,不是很适合于局域网(LAN)通信。

在网络通信和连接方面,TCP/IP协议要比WIN32通信API更适合一些。

WIN32通信API也不能用于实时通信。

不需要许多协议层的交互式,非实时的通信可以采用WIN32通信API来实现,WIN32通信API把串口操作(以及并口等)和文件操作统一起来了。

Windows串口通信相关API函数打开和关闭串口一.打开串口在32位的Windows系统中,串口和其他通信设备是作为文件处理的。

串口的打开,关闭,读取和写入所用的函数与操作文件的函数完全一致。

通信会话以调用CreateFile()开始。

CreateFile()为读访问,写访问或读写访问“打开”串口。

按照Windows的通常做法,CreateFile()返回一个句柄,随后在打开的端口的操作中使用。

CreateFile()函数非常的复杂,复杂性的原因之一是它是通用的。

可以使用CreateFile 打开已存在的文件,创建新文件或打开根本就不是文件的设备,例如串口,并口和调制解调器。

CreateFile()函数声明如下:HANDLE CreateFile(LPCTSTR lpFileName, // pointer to name of the fileDWORD dwDesiredAccess, // access (read-write) modeDWORD dwShareMode, // share modeLPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributesDWORD dwCreationDisposition, // how to createDWORD dwFlagsAndAttributes, // file attributesHANDLE hTemplateFile // handle to file with attributes to copy);CreateFile的参数解释:lpFileName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1/2dwDesiredAccess用来指定串口访问的类型。

应用Win32 API函数开发串口通讯程序

应用Win32 API函数开发串口通讯程序

应用Win32 API函数开发串口通讯程序
李青
【期刊名称】《机械与电子》
【年(卷),期】2007(000)010
【摘要】阐述了使用Win32 API函数开发串口通讯程序的方法.详细介绍了使用的主要函数和编程机制.
【总页数】3页(P56-58)
【作者】李青
【作者单位】贵州省移动通信有限责任公司贵阳分公司运行维护部,贵州,贵阳,550002
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.基于Windows API函数的串口通讯程序设计 [J], 龙灏;丁旭玲
2.在VC++下用Win32 API函数编写多线程串口通信程序 [J], 金剑
3.在VC++下用Win32 API函数编写多线程串口通信程序 [J], 金剑
4.一种利用Win32 API函数实现串口实时通迅的方法 [J], 罗云虎
5.Win32API函数在VFP程序设计中的应用 [J], 王雪松
因版权原因,仅展示原文概要,查看原文内容请购买。

win32下的几种串口通信编程

win32下的几种串口通信编程

类别:技术文章来源:未知作者:冯传玉关键字:串口加入日期:2003-10-29今天阅读:1总共阅读:8918win32下的几种串口通信编程安徽合肥冯传玉---- 要完成串口通信, 在32位模式下, 一般说来有以下四种方法:---- 1. 以文件方式打开串口:---- 这里使用的是Win32 API 函数, 所以无论在BCB或VC下都可以实现. 具体的函数的意义可以参考Win32 API的帮助.这里有一个易于使用的BCB下的类, 可以方便的使用串口.---- 下面给出简要说明:---- (1) 应用CreateFile() 来初始化串口FhFileComm=CreateFile( FCommName.c_str(),GENERIC_READ | GENERIC_WRITE,0, // exclusive access&lpSecurity,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // overlapped I/ONULL );if( FhFileComm == INVALID_HANDLE_VALUE)return false;(2) 应用WriteFile() 和ReadFile() 从串口读写数据bool MyComm::WriteBuffer(unsigned char*buffer,unsigned long length){return WriteFile(FhFileComm,buffer,length,&length,&FgOverLapped);}bool MyComm::ReadBuffer(unsigned char*buffer,unsigned long length){return ReadFile(FhFileComm,buffer,length,&length,&FgOverLapped);}相应的源文件为UsageComm.cpp UsageComm.h---- 2. 使用现成的控件:---- 易于使用的是微软的MS Communication 控件, 它是做为一个.ocx 提供的.---- 在BCB 中可以用Import ActiveX Control 将它加入到BCB 中, 缺省是加载在ActiveX 页中. 就可以作为一个普通的BCB 控件来使用了.(也有不少第三方提供的其它硬件操作控件)---- 3. 直接嵌入汇编法:---- (该方法不能在NT下使用, 由于98的非完全保护,下面的代码可以使用)利用BCB的直接嵌入汇编功能, 可以在BCB中直接对串口操作.---- 如下所示,在BCB中使用汇编代码如下byte __fastcall ReadByte(WORD Address)// eax :address{asm{mov DX,AXin AL,DX}}void __fastcall WriteByte(unsigned char byte, WORD Address)// EAX: BYTE EDX: ADDRESS{asm{out DX,AL}---- 这里必须用__fastcall 调用约定以使在调用该函数时用寄存器传递参数.---- (用在BCB中的汇编指令代码in 和out必须用小写,(其余可以为大写)寄存器名称大小写都可以) ---- 其它的如写多个字节,读多个字节, 同样可以实现.---- 4. 最困难的要数用VxD来实现:---- 这不是一下子能说得清的, 如果要做, 当然要找本书了.。

windowsapi在串口通信中的应用

windowsapi在串口通信中的应用

1引言在很多情况下,远程监控和工业自动化领域系统经常采用串并口通信编程,其中串行接口被广泛地应用于工程实践的长距离通信中。

运用 Windows通信API可以在 Windows环境下进行串口编程,不用对硬件直接进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。

本文对和串口通信相关的32位Windows API函数进行了介绍,并给出了相应的程序实例。

2Windows API 简介Win32 API 作为 Microsoft 32 位平台(包括:Windows 9x,Windows NT3.1 / 4.0/ 5.0, WindowsCE )的应用程序编程接口,它是构筑所有32位 Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。

API是windows的核心,从事Windows 应用程序开发,离不开对Win32 API函数的调用。

只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。

3Windows API相关串口通信函数介绍在32位的Windows系统中,串口通信是作为文件处理的,串口操作一般为的打开、关闭、读取、写入等操作,相应的Win dows API函数如下:3.1打开和关闭串口 1打开串口在Windows系统中串口通信会话以调用CreateFile ()函数开始。

CreateFile ()函数可以读写访问串口,并返回一个句柄,并在以后的端口操作中使用。

1.CreateFile () 函数声明如下:2.HANDLE CreateFile(3.LPCTSTR lpszNAME, // 指定要打开的串口逻辑名4.DWORDdwAccess, // 指定串口访问的类型5.DWORDdwShareMode, // 指定端口的共享属性6.LPSECURITY_ATTRIBUTES lpsa, // 弓I用安全属性结构SECURITY_ATTRIBUTES7.DWORDdwCreate, // 指定CreateFile() 正在被已有的文件调用时应采取的措施8.DWORDdwAttrsAndFlags, // 描述端口的各种属性9.HANDLE hTemolateFile // 指向模板文件的句柄10.)11.其中安全属性结构SECURITY_ATTRIBUTES 结构声明如下:12.typedef struct_SECURITY_ATTRIBUTES{13.DWORDiLength; // 指明该结构的长度14.LPVOID lpSecurityDescriptor; // 指向一个安全描述字符15.BOOL bInheritHandle; // 表明句柄是否能被继承16.}SECURITY_ATTRIBUTES;17.调用CreateFile () 函数打开COM1串口操作如下所示:18.HANDLE hCOM;19.DWORDDWeRROR;20.hCom=Creatfile ( “COM” , // 对串口 1 进行操作21.GENERIC_READ | GENERIC_WRITE, // 允许读和写22.0, //独占方式23. NULL,24. OPEN_EXISTING,25. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 重叠方式26. NULL 27. );28. if (hCOM==INVALID_HANDLE_VALUE) 29. {30. dwError=GetLastError( ); // 处理错误31. }一旦串口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用 SetupComm()函数实现其他初始化工作。

win32串口通信c语言

win32串口通信c语言

w i n 32串口通信c 语言标标题题::W W i i n n 3322下下使使用用C C 语语言言进进行行串串口口通通信信导导言言::串串口口通通信信在在嵌嵌入入式式系系统统和和物物联联网网应应用用中中扮扮演演着着重重要要角角色色。

本本文文将将介介绍绍如如何何使使用用C C 语语言言在在W W i i n n 3322平平台台下下进进行行串串口口通通信信的的基基本本操操作作和和流流程程,,涵涵盖盖串串口口的的初初始始化化、、数数据据读读写写以以及及错错误误处处理理等等方方面面的的内内容容。

#### 11.. 环环境境准准备备在在进进行行串串口口通通信信前前,,需需要要使使用用相相应应的的开开发发环环境境和和工工具具。

以以下下是是环环境境搭搭建建的的基基本本步步骤骤::-- 安安装装合合适适的的C C 编编译译器器,,如如M M i i n n G G W W 或或者者D D e e v v --C C ++++。

-- 确确保保系系统统中中包包含含``w w i i n n d d o o w w s s ..h h ``头头文文件件,,该该头头文文件件包包含含了了W W i i n n 3322 A A P P I I 的的定定义义。

#### 22.. 串串口口初初始始化化在在进进行行串串口口通通信信前前,,需需要要对对串串口口进进行行初初始始化化设设置置,,包包括括波波特特率率、、数数据据位位、、停停止止位位和和校校验验位位等等参参数数的的配配置置。

下下面面是是一一个个简简单单的的串串口口初初始始化化函函数数示示例例::``````c c##i i n n c c l l u u d d e e <<w w i i n n d d o o w w s s ..h h >>H H A A N N D D L L E E S S e e r r i i a a l l I I n n i i t t ((i i n n t t p p o o r r t t ,, i i n n t t b b a a u u d d r r a a t t e e )){{H H A A N N D D L L E E h h S S e e r r i i a a l l ;;D D C C B B d d c c b b S S e e r r i i a a l l P P a a r r a a m m s s == {{00}};;//// 打打开开串串口口c c h h a a r r p p o o r r t t N N a a m m e e [[1100]];;s s p p r r i i n n t t f f ((p p o o r r t t N N a a m m e e ,, ""C C O O M M %%d d "",, p p o o r r t t ));;h h S S e e r r i i a a l l == C C r r e e a a t t e e F F i i l l e e ((p p o o r r t t N N a a m m e e ,, G G E E N N E E R R I I C C __R R E E A A D D || G G E E N N E E R R I I C C __W W R R I I T T E E ,, 00,, N N U U L L L L ,, O O P P E E N N __E E X X I I S S T T I I N N G G ,,F F I I L L E E __A A T T T T R R I I B B U U T T E E __N N O O R R M M A A L L ,, N N U U L L L L ));;i i f f ((h h S S e e r r i i a a l l ==== I I N N V V A A L L I I D D __H H A A N N D D L L E E __V V A A L L U U E E )) {{p p r r i i n n t t f f ((""无无法法打打开开串串口口!!\\n n ""));;r r e e t t u u r r n n I I N N V V A A L L I I D D __H H A A N N D D L L E E __V V A A L L U U E E ;;}}//// 配配置置串串口口参参数数d d c c b b S Se e r r i i a a l l P P a a r r a a m m s s ..D D C C B B l l e e n n g g t t h h ==s s i i z z e e o o f f ((d d c c b b S S e e r r i i a a l l P P a a r r a a m m s s ));;i i f f ((!!G G e e t t C C o o m m m m S S t t a a t t e e ((h h S S e e r r i i a a l l ,, &&d d c c b b S S e e r r i i a a l l P P a a r r a a m m s s )))) {{p p r r i i n n t t f f ((""无无法法获获取取串串口口参参数数!!\\n n ""));;C C l l o o s s e e H H a a n n d d l l e e ((h h S S e e r r i i a a l l ));;r r e e t t u u r r n n I I N N V V A A L L I I D D __H H A A N N D D L L E E __V V A A L L U U E E ;;}}d d c c b b S Se e r r i i a a l l P P a a r r a a m m s s ..B B a a u u d d R R a a t t e e == b b a a u u d d r r a a t t e e ;;d d c c b b S Se e r r i i a a l l P P a a r r a a m m s s ..B B y y t t e e S S i i z z e e == 88;;d d c c b b S Se e r r i i a a l l P P a a r r a a m m s s ..S S t t o o p p B B i i t t s s == O O N N E E S S T T O O P P B B I I T T ;;d d c c b b S Se e r r i i a a l l P P a a r r a a m m s s ..P P a a r r i i t t y y == N N O O P P A A R R I I T T Y Y ;;i i f f ((!!S S e e t t C C o o m m m m S S t t a a t t e e ((h h S S e e r r i i a a l l ,, &&d d c c b b S S e e r r i i a a l l P P a a r r a a m m s s )))) {{ p p r r i i n n t t f f ((""无无法法设设置置串串口口参参数数!!\\n n ""));;C C l l o o s s e e H H a a n n d d l l e e ((h h S S e e r r i i a a l l ));;r r e e t t u u r r n n I I N N V V A A L L I I D D __H H A A N N D D L L E E __V V A A L L U U E E ;;}}r r e e t t u u r r n n h h S S e e r r i i a a l l ;;}}``````#### 33.. 数数据据读读写写完完成成串串口口的的初初始始化化后后,,可可以以进进行行串串口口数数据据的的读读写写操操作作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用Win32API实现Windows下异步串口通讯目录:1.异步非阻塞串口通讯的优点2.异步非阻塞串口通讯的基本原理3.异步非阻塞串口通讯的基础知识4.异步非阻塞串口通讯的实现步骤一,异步非阻塞串口通讯的优点读写串行口时,既可以同步执行,也可以重叠(异步)执行。

在同步执行时,函数直到操作完成后才返回。

这意味着在同步执行时线程会被阻塞,从而导致效率下降。

在重叠执行时,即使操作还未完成,调用的函数也会立即返回。

费时的I/O操作在后台进行,这样线程就可以干别的事情。

例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。

"重叠"一词的含义就在于此。

二,异步非阻塞串口通讯的基本原理首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口;其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始超时设置;然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。

三,异步非阻塞串口通讯的基础知识下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数CreateFile()功能:打开串口设备函数原型HANDLE CreateFile(LPCTSTR lpFileName, // 串口名称字符串;如:"COM1" 或"COM2"DWORD dwDesiredAccess, // 设置读写属性(访问模式);一般为GENERIC_READ|GENERIC_WRITE, DWORD dwShareMode, // 共享模式;"必须"为0, 即不能共享LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为NULLDWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值;在这里"必须"为OPEN_EXISTING DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成FILE_FLAG_OVERLAPPED ,实现异步I/OHANDLE hTemplateFile // 临时文件的句柄,通常为NULL);说明:如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。

Forexample:Handle m_hComm =CreateFile(com1,GENERIC_READ||GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERL APPED,0);CloseHandle();功能:关闭串口BOOL CloseHandle(HANDLE hObject // handle to object to close)这个,我想就不多说了吧!GetCommState()功能:获得串口状态BOOL GetCommState(HANDLE hFile, // handle of communications deviceLPDCB lpDCB // address of device-control block structure);SetCommState()功能:设置串口状态BOOL SetCommState(HANDLE hFile, // handle of communications deviceLPDCB lpDCB // address of device-control block structure);说明:在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。

这需要通过一个DCB结构来进行。

DCB 结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。

在查询或配置置串行口的属性时,都要用DCB结构来作为缓冲区。

调用GetCommState函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。

一般在用CreateFile打开串行口后,可以调用GetCommState函数来获取串行口的初始配置。

要修改串行口的配置,应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串行口Forexample:DCB dcb;memset(&dec,0,dizeof(dcb));if(!GetCommState(HComm,&dcb))//获取当前DCB配置return FALSE;dcb.BaudRate = CBR_9600;//修改数据传输率............if(SetCommState(hComm,&dcb))//设置新参数...... //错误处理BuildCommDCB()功能:初始化DCB结构BOOL BuildCommDCB(LPCTSTR lpDef, // pointer to device-control stringLPDCB lpDCB // pointer to device-control block);Forexample:DCB dcb;memset(&dcb,0,sizeof(dcb));dcb.DCBlength = sizeof(dcb);if(!BuildCommDCb("9600,n,8,1",&dcb))//"baud=9600 parity=N data=8 stop=1"{...... //参数修改错误return FALSE;}else{...... //己准备就绪}说明:功能同上面的例子。

SetupComm()功能:设置I/O缓冲区的大小函数原型:BOOL SetupComm(HANDLE hFile, // handle to communications deviceDWORD dwInQueue, // size of input bufferDWORD dwOutQueue // size of output buffer);说明:除了在DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。

Windows用I/O缓冲区来暂存串行口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。

调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。

先介绍一个结构:COMMTIMEOUTStypedefstruct _COMMTIMEOUTS {DWORD ReadIntervalTimeout; // 读间隔超时DWORD ReadTotalTimeoutMultiplier; // 读时间系数DWORD ReadTotalTimeoutConstant; // 读时间常量DWORD WriteTotalTimeoutMultiplier; // 写时间系数DWORD WriteTotalTimeoutConstant; // 写时间常量} COMMTIMEOUTS,*LPCOMMTIMEOUTS;再介绍两个函数GetCommTimeouts功能:读取TimeOut的值函数原型:BOOL GetCommTimeouts(HANDLE hFile, // handle of communications deviceLPCOMMTIMEOUTS lpCommTimeouts // address of comm. time-outs structure);SetCommTimeouts功能:设置TimeOUt的值函数原型:BOOL SetCommTimeouts(HANDLE hFile, // handle of communications deviceLPCOMMTIMEOUTS lpCommTimeouts // address of communications time-out structure);这里顺便介绍一下TimeOut机制的两个性质:超时函数说明:在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。

如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。

要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。

调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。

有两种超时:间隔超时和总超时。

间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。

写操作只支持总超时,而读操作两种超时均支持。

用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:COMMTIMEOUTS结构的成员都以毫秒为单位。

总超时的计算公式是:总超时=时间系数×要求读/写的字符数+ 时间常量例如,如果要读入10个字符,那么读操作的总超时的计算公式为:读总超时=ReadTotalTimeoutMultiplier×10 + ReadTotalTimeoutConstant可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。

如果所有写超时参数均为0,那么就不使用写超时。

如果ReadIntervalTimeout为0,那么就不使用读间隔超时,如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。

如果读间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求的字符。

在用重叠方式读写串行口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。

在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。

Forexample:COMMTIMEOUTS timeOver;memset(&&timeOver.0.sizeof(timeOver));DWORDtimeMultiplier,timeConstant;timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;timeOver.ReadTotalTimeoutConstant=timeConstant;SetCommTimeouts(hComport,&&timeOver);ReadFile()功能:读取数据函数原型:BOOL ReadFile(HANDLE hFile, // 串口名称字符串(文件句柄)LPVOID lpBuffer, // 读缓冲区DWORD nNumberOfBytesToRead, // 要求读入的字节数LPDWORD lpNumberOfBytesRead, // 实际读入的字节数LPOVERLAPPED lpOverlapped // 指向一个OVERLAPPED结构); //若返回TRUE则表明操作成功Forexample:char *pReciveBuf;DWORD nWantRead = 100,nReadRead;LPOVERLAPPED m_OverlappedRead;BOOL bReadStatus = ReadFile( m_hComm, preciveBuf,nWantRead, &&nReadRead,&&m_OverlappedRead );WriteFile()功能:来将资料写入Serial port.函数原型:BOOL WriteFile(HANDLE hFile, // handle to file to write toLPCVOID lpBuffer, // pointer to data to write to fileDWORD nNumberOfBytesToWrite, // number of bytes to writeLPDWORD lpNumberOfBytesWritten, // pointer to number of bytes writtenLPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O);说明:ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。

相关文档
最新文档