串口通信学习资料 - 图文

更新时间:2023-12-23 16:11:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《Visual C++ 串口通信技术与工程实践》

目录

一、接口........................................................................................................................ 2 1.接口的功能:............................................................................................................. 2 2.接口的类型:............................................................................................................. 2 3.接口的工作方式:..................................................................................................... 2 4.RS-232-C串口标准 ..................................................................................................... 3 5.RS-232C的接口信号: ............................................................................................. 5 二、端口通信编程........................................................................................................ 7

1.端口通信方式...................................................................................................... 7 2.端口通信协议...................................................................................................... 7 Windows API 编程控制串口 ........................................................................................ 8

1.打开串口.............................................................................................................. 8 2.关闭串口.............................................................................................................. 9 3.串口配置.............................................................................................................. 9 4.串口属性............................................................................................................ 12 5.通用通信设备配置............................................................................................ 14 6.缓冲区控制........................................................................................................ 15 7.读写串口............................................................................................................ 16

1.读串口操作:............................................................................................. 16 2.写串口操作:............................................................................................. 16 3.异步操作..................................................................................................... 17

一、接口

1.接口的功能:

CPU 与外设之间的数据交换需通过接口来实现,因此接口应具备以下一些功能: 1. 数据缓冲功能:接口中设置数据寄存器或锁存器,以解决主机高速与外设低速的矛盾。

2. 信号转换功能:转换外设提供的状态信号和它所需要的控制信号与微机的总线信号不兼容的问题。

3. 设备选择功能:接口的地址码对外设进行寻址,被选定的设备才能与CPU进行数据交换。

4. 接收、解释并执行微处理器的命令功能:接口电路要提供寄存器“空、满、准备好、忙、闲”等状态信号,并向CPU报告工作情况。 5. 中断管理功能:接口中设置中断控制器,为CPU处理中断事物。

6. 数据宽度变换的功能:CPU处理的是并行数据,而串口只能处理串行数据。 7. 可编程功能:只改动驱动程序就可改变接口的工作方式。

2.接口的类型:

1. 并行接口 2. 串行接口 3. 磁盘接口

4. SCSI小计算机系统接口 5. USB接口

3.接口的工作方式:

1. 程序查询方式:CPU通过I/O指令指定外设当前的状态,如果外设准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询。

2. 中断处理方式:这种方式下,CPU不用被动等待,而是可执行其他程序,一旦外设为数据交换准备就绪,就可向CPU提出服务请求,CPU若响应该请求,便暂停当前执行的程序,转去执行与请求对应的程序,完成后再来执行原来被中断的程序。优点:省去了查询外设和等待外设准备就绪的时间,满足了外设的实时要求。缺点:没攒送一个字符都要进行一个中断,启动中断控制器(I/O接口芯片。)中断前后分别要保留和恢复中断浅的现场数据,因此程序花费的工作量大,不适用于大型数据交换时。

3. DMA(直接存储器存储)传送方式:不用软件而是用硬件电路-DMA控制器来控制内存与外设之间的数据交流,无需CPU介入,提高了工作效率。在DMA传数据之前,DMA控制器会向CPU请求总线控制权,CPU允许则将控制权交出,传输结束后,再将控制权交给CPU。

4.RS-232-C串口标准:

RS-232常用与连接到Modem。内置于每一台计算机,还有打印机、数据采集模块、测试装置和控制回路。

DTE:Data Terminal Equipment接收和发送数据的设备为数据终端设备。 DCE:Data Communication Equipment连接与数据通信网络的设备。例如调试解调器Modem或线路驱动,目前流行模拟电话线路。用来实现数字信号与模拟信号之间的转换。 2.连接器的机械特性:

9针串口(DB9) 针号 功能说明 1 2 3 4 5 6 7 8 9 规定 工作方式 节点数 最大传输电缆长度 最大传输速率 最大驱动输出电压 RS232 单端 数据载波检测 接收数据 发送数据 数据终端准备 信号地 请求发送 清除发送 振铃指示 缩写 DCD RXD TXD DTR GND RTS CTS DELL 25针串口(DB25) 针号 功能说明 8 3 2 7 6 4 5 缩写 数据载波检测 DCD 接收数据 发送数据 信号地 数据准备好 请求发送 清除发送 RXD TXD GND DSR RTS CTS DELL 20 数据终端准备 DTR 数据设备准备好 DSR 22 振铃指示 RS422 差分 400英尺 10Mb/s -0.25V~+6V R485 差分 400英尺 10Mb/s -7V~+12V +/-1.5V +/-6V 54 N/A +/-200mV ≥12K -1V~+3V -7V~+12V 1收、1发 50英尺 20Kb/S +/-25V 1发10收 1发32收 驱动器输出信号电平 负载 +/-5V~+/-15V +/-2.0V (负载最小值) 驱动器输出信号电平 空载 +/-25V (空载最大值) 驱动器负载阻抗(Ω) 摆率(最大值) 接收器输入电压范围 接收器输入门限 接收器输入电阻(Ω) 驱动器共模电压 接收器共模电压 3K~7K 30V/μs +/-15V +/-3V 3K~7K +/-6V 100 N/A +/-200mV 4K(最小) -3V~+3V -7V~+7V -10V~+10V -7V~+12V 5.RS-232C的接口信号:

(1)联络控制信号线:

数据装置准备好(Data set ready-DSR)——有效时(ON)状态,表明MODEM处于可以使用的状态。

数据终端准备好(Data set ready-DTR)——有效时(ON)状态,表明数据终端可以使用。

这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。

请求发送(Request to send-RTS)——用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON状态),向MODEM请求发送。它用来控制MODEM是否要进入发送状态。 允许发送(Clear to send-CTS)——用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当MODEM已准备好接收终端传来的数据,并向前发送时,使该信号有效,通知终端开始沿发送数据线TxD发送数据。

这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中作发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号,使其变高。

接收线信号检出(Received Line detection-RLSD)——用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字两数据后,沿接收数据线RxD送到终端。此线也叫做数据载波检出(Data Carrier dectection-DCD)线。

振铃指示(Ringing-RI)——当MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。 (2)数据发送与接收线:

发送数据(Transmitted data-TxD)——通过TxD终端将串行数据发送到MODEM,(DTE→DCE)。

接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCE→DTE)。 (3)地线

有两根线SG、PG——信号地和保护地信号线,无方向。

上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有当DSR和DTR都处于有效(ON)状态时,才能在DTE和DCE之间进行传送操作。若DTE要发送数据,则预先将DTR线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能在TxD线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为半双工的通信才能确定DCE已由接收方向改为发送方向,这时线路才能开始发送。

2个数据信号:发送TXD;接收RXD。 1个信号地线:SG。 6个控制信号:

DSR��数传机(即modem)准备好,Data Set Ready.

DTR��数据终端(DTE,即微机接口电路,如Intel8250/8251,16550)准备好,Data Terminal Ready。 RTS��DTE请求DCE发送(Request To Send)。 CTS��DCE允许DTE发送(Clear To Send),该信号是对RTS信号的回答。 DCD��数据载波检出,Data Carrier Detection当本地DCE设备(Modem)收到对方的DCE设备送来的载波信号时,使DCD有效,通知DTE准备接收, 并且由DCE将接收到的载波信号解调为数字信号, 经RXD线送给DTE。 RI��振铃信号 Ringing当DCE收到交换机送来的振铃呼叫信号时,使该信号有效,通知DTE已被呼叫。 用途 232引CCITT Modem 名称 说明 异同脚 步 步 PE1 101 AA 保护地 设备外壳接地 PE √ 2 103 BA 发送数据 数据送Modem TXD 3 104 BB 接收数据 从Modem接收数据 RXD 在半双工时控制发送器的4 105 CA 请求发送 RTS 开和关 5 106 CB 允许发送 Modem允许发送 CTS 6 107 CC 数据终端准备好 Modem准备好 DSR SG7 102 AB 信号地 信号公共地 SG √ Modem正在接收另一端送来8 109 CF 载波信号检测 DCD 的信号 9 空 10 空 11 空 接收信号检测12 在第二通道检测到信号 √ (2) 13 允许发送(2) 第二通道允许发送 √ 14 118 发送数据(2) 第二通道发送数据 √ 为Modem提供发送器定时信15 113 DA 发送器定时 √ 号 16 119 接收数据(2) 第二通道接收数据 √ 17 115 DD 接收器定时 为接口和终端提供定时 √ 18 空 19 请求发送(2) 连接第二通道的发送器 √ 20 108 CD 数据终端准备好 数据终端准备好 DTR 21 空 22 125 振铃 振铃指示 RI 23 111 CH 数据率选择 选择两个同步数据率 √ 24 25 114 DB 发送器定时 空 为接口和终端提供定时 √ 二、端口通信编程 1.端口通信方式: 1.同步传输方式: 2.异步传输方式: 2.端口通信协议: 1.ISO的OSI(开放系统互联)模型: 应用层 对话层 传输层 网络层 数据链路层 物理层(网络硬件) 应用层 对话层 传输层 网络层 数据链路层 物理层(网络硬件) 一般通信协议只涉及到OSI中的某几层,如EIA-RS-232C实现了物理层。 2.串行通信协议 分为同步和异步。 (1) 面向字符的同步协议 (2) 面向比特的同步协议 (3) 起止式异步协议 4. 数据安全和完整 由于干扰,其各比特可能会发生错误。因此会有检错及纠错的方法。 奇偶校验:计算数据中为1的比特个数,再增加一个附加比特,使得1的个数为偶数(偶校验)或奇数(奇校验),该附加比特为奇偶比特。缺点:只能检测出部分误码,2bit误码不能检出,2bit以上的检测取决于误码比特的奇偶数。 循环冗余校验:CRC将每个比特串看做一个多项式,通过多项式除法来检测错误的方法。 Windows API 编程控制串口 1.打开串口: CreateFile():打开串口,返回一个句柄 声明如下: HANDLE CreateFile( LPCTSTR 串口逻辑名,用字符串表示,”COM1”, DWORD 指定串口访问的类型,GENERIC_READ|GENERIC_WRITE:既读又写, DWORD 该端口的共享属性,0:不能共享, LPSECURITY_ATTRIBUTES 引用安全属性结构,NULL:为该端口分配默认的安全性属性, DWORD 指定调用该函数时应采取的动作,不是创建端口而是打开已经存在的端口。OPEN_EXISTING, DWORD 描述了端口的各种属性,FILE_FLAG_OVERLAPPED:意思是端口I/O可以在后台运行,异步方式。FLIE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED:重叠方式。NULL:同步方式, HANDLE 指向模板文件的句柄,当端口处于打开状态时,必须置0,); If(句柄名==INVALID_HANDLE_VALUE) { dwError=GetLastError();//处理错误 } 需定义:const GENERIC_READ=0x80000000h; const GENERIC_ WRITE=0x40000000; const FILE_FLAG_MORMAL=0X40000000; const OPEN_EXISTING=3; 安全属性结构: typedef struct_SECURITY_ATTRIBUTES{ DWORD 指明该结构的长度; LPVOID 指向一个安全描述字符; BOOL 表明句柄是否能够被继承; } SECURITY_ATTRIBUTES; 一旦串口处于打开状态,则可以分配一个发送缓冲区和接受缓冲区,并可通过调用SetupComm()实现其他初始化工作。若不调用该函数,则windows会分配默认的发送和接收缓冲区,并初始化端口。但为了保证缓冲区的大小和实际需要一纸,最好还是调用该函数。函数声明如下: BOOL SetupComm( HANDLE 通信设备的句柄, DWORD 接收缓冲区大小, DWORD 发送缓冲区大小); 2.关闭串口 CloseHandle(HANDLE 需关闭的设备句柄); 3.串口配置 若应用程序只需要修改一部分配置的时候,使用GetCommState()函数获得当前的串口配置,使用SetCommState()重新分配串口资源的各个参数。 1 GetCommState()的函数声明如下: BOOL GetCommState( HANDLE 通信设备句柄, LPDCB 指向DCB(设备控制块)结构的指针 );若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。 2 GetLastError()函数声明如下:DWORD GetLastError(VOID) 3 SetCommState()声明如下: BOOL SetCommState( HANDLE 已打开的串口的句柄, LPDCB 指向DCB结构的指针); 若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。 4 typedef struct _DCB { // dcb DWORD 以字节为单位指定DCB结构的大小; DWORD 现在的数据传输率可以是实际的数据传输率,也可是下列数据之一:CBR_110、CBR_19200、CBR_300、CBR_38400 CBR_600 CBR_12800 CBR_1200 CBR_57600 CBR_2400 CBR_115200 CBR_4800 CBR_12800 CBR_9600 CBR_25600 CBR_14400; DWORD 二进制模式,不校验EOF,必须设置为TRUE; DWORD 是否允许奇偶校验:若设置为TRUE,则执行奇偶检验并报告错误信息; DWORD 指定CTS是否监测输出流控制:若为TRUE,而CTS为OFF时,发送将被挂起,直到CTS置ON; DWORD 指定DSR是否监测输出流控制:若为TRUE,而DSR为OFF时,发送将被挂起,直到DSR置ON; DWORD DTR流控制类型,可以是表中的任何一个值:; DTR流量控制表: DTR_CONTROL_DISABLE 禁止DTR线,并保持禁止状态 DTR_CONTROL_ENABLE 允许DTR线并保持允许状态 DTR_CONTROL_HANDSHAKE 允许DTR握手,如果允许握手,则不允许应用程序使用EscapeCommFunction函数调整线路 DWORD 指定通信驱动对DTR信号线是否敏感:若该位置设置为TRUE,DSR信号为OFF时,接收的任何字节将被忽略; DWORD fTXContinues TX:若为TRUE时,在接收缓冲区接收到了缓冲区已满的字节XoffLim,并且驱动程序已经发送出xoffChar字符终结接收字节之后,发送继续进行,若为FLASE,在接收缓冲区接收到了缓冲区已空的字节XonLim,并且驱动程序已经发送出恢复发送的xonChar字符之后,发送可以继续进行; DWORD XON/XOFF输出流控制:为TRUE时,接收到XoffChar之后停止发送,接收到XonChar之后发送将重新开始; DWORD XON/XOFF输入流控制:为TRUE时,接收缓冲区接收到代表缓冲区已满的字节XoffLim之后,XoffChar发送出去。在接收缓冲区接收到了缓冲区已空的字节XonLim之后,XonChar发送出去; DWORD 错误替换: 该成员为TRUE时,并且“允许奇偶校验设置为Y=TRUE时,就会用ErrorChar成员指定的字符代替奇偶校验错误的接收字符; DWORD 指明是否丢弃接收的NULL字符: 为TRUE时,接收时去掉空字节,反之不丢弃; DWORD RTS流控制:可以取下标的值; RTS_CONTROL_DISABLE 打开设备时禁止RTS线,并保持禁止状态 RTS_CONTROL_ENABLE 打开设备允许RTS线,并保持允许状态 DTR_CONTROL_HANDSHAKE 允许握手,在接收缓冲区少于半满时将RTS置ON,在接收缓冲区超过3/4将RTS置OFF。如果允许握手,则不允许应用程序使用EscapeCommFunction函数调整线路 DTR_CONTROL_TOGGLE 当发送的字节有效,将RTS置ON,发送完缓冲区的所有字节后,RTS置OFF

5 DWORD 发送错误,制定是否终止读、写操作:若为TRUE,当发送错误的时候,驱动程序以出错状态停止所有的读写操作。只有当应用程序调用ClearCommError()函数处理后,串口才能接受随后的通信操作; DWORD fDummy2:17; 保留 WORD wReserved; 现在不用,必须为0 WORD XonLim; XOFF字符发送之前接收到缓冲区中可允许的最小字节数 WORD XoffLim; XOFF字符发送之前缓冲区中可允许的最小字节数 BYTE ByteSize; 端口当前使用的数据位: 4-8 BYTE Parity; 当前使用的奇偶校验法值如下: EVENPARITY 偶校验 MARKPARITY 标号校验 NOPARITY 无校验 ODDPARITY 奇校验 SPACEPARITY 空格校验 BYTE StopBits; 当前使用的停止位 ,如下表: ONESTOPBIT 1位停止位 ONE5STOPBIT 1.5位停止位 TWOSTOPBIT 2位停止位 Char XonChar; 指明发送和接收的XON字符值,表示允许继续传输 char XoffChar; 发送和接收的XOFF字符值,暂停数据传输 char ErrorChar;用来代替接收到的奇偶校验发生错误的字符 char EofChar; 表示数据的结束 char EvtChar; 事件字符 ,当接收到此字符的时候,会产生一个事件 WORD wReserved1; 保留的位。没有使用 } DCB; BuildCommDCB()用来改变设置,该设置将提供给DCB结构,声明如下: BOOL BuildCommDCB( LPCTSTR 设置的字符串, LPDCB 指向dcb的结构指针); Baud=1200 parity=N data=8 stop=1 该函数禁止XON/XOFF和硬件流的控制,如果使用硬件流的控制,则需设置DCB结构的各个成员值。若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。 还提供了BuildCommDCBndTimeouts()函数来设置DCB的功能,可进一步设置超时结构。声明如下: BOOL BuildCommDCBndTimeouts( LPCTSTR 设置的字符串, LPDCB 指向dcb的结构指针, LPCOMMTIMEOUTS 指向超时结构的指针); 该函数是根据字符串的值来设置修改它的超时结构。若包含“TO=ON“,则函数根据超时结构指针为串口设置超时值;若包含“TO=OFF“,则函数不为串口设置超时值;若函数不包含”TO=XXX”的字串,函数将忽视指针的超时结构,该超时结构将不被获取。 4.串口属性 串口的属性可通过GetCommProperties()函数获得。 该函数声明如下: BOOL GetCommProperties( HANDLE 返回的句柄, LPCOMMPROP 指向COMMPROP结构的指针); COMMPROP结构的类型定义如下: typedef struct _COMMPROP { WORD wPacketLength; // 整个数据簿的大小 WORD wPacketVersion; // COMMPROP结构的版本号 DWORD dwServiceMask; // 指定一位掩码,指出该设备实现的服务,对于串口和modem,可设为:SP_SERHLCOMM. DWORD dwReserved1; // reserved DWORD dwMaxTxQueue; //指定驱动程序内部发送缓冲区的最大允许速度,以字节表示,返回值0,则意味着对长度没有限制。 DWORD dwMaxRxQueue; //指定驱动程序内部接收缓冲区的最大允许速度,以字节表示,返回值0,则意味着对长度没有限制。 DWORD dwMaxBaud; // 以字节为单位指定可用的最大速度传输率,可以是如下表1中的值: DWORD dwProvSubType; // 指定通信设备的类型,如下表2所示: DWORD dwProvCapabilities; // 指定一个位掩码表识设备能够实现的功能,如下表3所示: DWORD dwSettableParams; // 指定一个位掩码表识可修改的通信参数的功能,可取表4中的值: DWORD dwSettableBaud; // 指定一个位掩码表识可设置的数据传输率 ,如上表1中,取值 WORD wSettableData; // 指定一个位掩码表识可设置的数据位数,见表5: WORD wSettableStopParity; // 指定一个位掩码表识可设置的停止位数和奇偶校验位,如表6: DWORD dwCurrentTxQueue; // 以字节为单位指定当前发送缓冲区大小 DWORD dwCurrentRxQueue; //以字节为单位指定当前接收缓冲区大小 DWORD dwProvSpec1; // 指定设备的特定数据。在调用GetCommProperties函数之前需设置该成员为COMMPROP_INITIALALIZED,表明wPacketLength成员有效。该参数未用 DWORD dwProvSpec2; //该参数未用,指定特定的设备数据,若没有关于设备要求的数据格式信息,则应用程序忽略该成员 WCHAR wcProvChar[1]; //指定特定的设备数据,若没有关于设备要求的数据格式信息,则应用程序忽略该成员。wcProvChar[1]参数值分别设置为如下: } COMMPROP; 5.通用通信设备配置 函数CommConfigDialog()显示一个对话框,来对通信设备进行配置。声明如下: BOOL CommConfigDialog( LPTSTR lpszName, // 要配置的端口名 HWND hWnd, // 拥有此对话框的窗口句柄 LPCOMMCONFIG lpCC // 指向一个COMMCONFIG结构 ); COMMCONFIG结构的声明如下: typedef struct _COMM_CONFIG { DWORD dwSize; // 整个结构长度 WORD wVersion; // 结构的版本号 WORD wReserved; // reserved DCB dcb; // 一个DCB结构的参数 DWORD dwProviderSubType; DWORD dwProviderOffset; DWORD dwProviderSize; 提供有关供应商的信息 WCHAR wcProviderData[1]; } COMMCONFIG, *LPCOMMCONFIG; 更改需要通过SetCommState’函数来改变 6.缓冲区控制 SetupComm函数实现初始化的缓冲区操作, PurgeComm()和FlushFileBuffers()来进行缓冲区操作。 PurgeComm()该函数不能保证缓冲区内所有的字符都被发送,声明如下: BOOL PurgeComm( HANDLE 返回的句柄, DWORD 执行的操作);若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。 执行的操作可以是表中的任一个: PURGE_TXABORT 即使发送操作没有完成,也终止所有的重叠发送操作,立即返回 PURGE_RXABORT 即使接收操作没有完成,也终止所有的重叠接收操作,立即返回 PURGE_TXCLEAR 清除发送缓冲区 PURGE_RXCLEAR 清除接收缓冲区 FlushFileBuffers()该函数能保证缓冲区内所有的字符都被发送,声明如下: BOOL FlushFileBuffers( HANDLE 函数打开的句柄);若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。

7.读写串口 1.读串口操作:

ReadFile()或者ReadFileEx(),都受到是否异步、超时的操作的限制: ReadFile()同步异步都支持,声明如下: BOOL ReadFile(

HANDLE hFile, 指向标识的句柄,该句柄必须拥有GENERTIC_READ权限 LPVOID lpBuffer, 指向一个缓冲区

DWORD nNumberOfBytesToRead, 从串口中读取的字节数

LPDWORD lpNumberOfBytesRead, 指向调用该函数读取的字节数

LPOVERLAPPED lpOverlapped 一个OVERLAPPED结构,如果hFile以FILE_FLAS_OVERLAPPED的方式创建,则需要此结构。 );

如果该函数因为超时而返回,则返回值为TRUE,参数lpOverlapped若设为NULL,则只进行同步操作,而不管句柄是否由FILE_FLAS_OVERLAPPED创建。

若该函数返回FLASE,则不一定是操作失败,线程应调用GetLastError()函数来分析结果。

ReadFileEx()只支持异步操作,声明如下: BOOL ReadFileEx(

HANDLE hFile, 指向标识的句柄该句柄必须拥有GENERTIC_READ权限 LPVOID lpBuffer, 指向一个缓冲区

DWORD nNumberOfBytesToRead, 指定要从串口设备读取的字节数 LPOVERLAPPED lpOverlapped, 一个OVERLAPPED结构 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

指向一个I/O操作完成后的常用例子的地址 );

若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。

2.写串口操作:

WriteFile()和WriteFileEx()向串口中写数据。都受到是否异步、超时的操作的限制:

WriteFile()同步、异步都支持,声明如下: BOOL WriteFile(

HANDLE hFile, 指向标识的句柄,该句柄必须拥有GENERTIC_WRITE权限 LPCVOID lpBuffer, 指向一个缓冲区

DWORD nNumberOfBytesToWrite, 指定要向串口设备写入的字节数 LPDWORD lpNumberOfBytesWritten, 指向调用该函数要写入的字节数 LPOVERLAPPED lpOverlapped 一个OVERLAPPED结构

);

若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。

WriteFileEx()只支持异步操作,声明如下: BOOL WriteFileEx(

HANDLE hFile,指向标识的句柄,该句柄必须拥有GENERTIC_WRITE权限 LPCVOID lpBuffer, 指向一个缓冲区

DWORD nNumberOfBytesToWrite, 指定要向串口设备写入的字节数 LPOVERLAPPED lpOverlapped, 一个OVERLAPPED结构

LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine 指向一个I/O操作完成后的常用例子的地址 );

若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。

还提供了TransmitCommChar()函数。可以在发送时指定一个字符的传递权限级别最高,该字符可以在其他字节发送之前发送。该函数是同步函数,受流量控制和写超时支配。当端口没有传输时,不能重复使用该函数。 BOOL TransmitCommChar(

HANDLE hFile, 标识通信端的句柄 char cChar 要发送的字符 );

若调用成功,则返回值不为0,若调用失败,则返回值为0.若希望得到进一步的错误信息,可调用GetLastError()函数来获取。

3.异步操作

要使用OVERLAPPED结构,CreatFile函数的dwFlagAndAttributes参数必须设为FILE_FLAG_OVERLAPPED标识,读写串口函数必须指定OVERLAPPED.

typedef struct _OVERLAPPED { // o DWORD Internal;

DWORD InternalHigh; DWORD Offset;

DWORD OffsetHigh; HANDLE hEvent; } OVERLAPPED;

本文来源:https://www.bwwdw.com/article/ip75.html

Top