欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    VC++串口编程.pdf

    • 资源ID:70321575       资源大小:874.24KB        全文页数:63页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    VC++串口编程.pdf

    深入浅出深入浅出 VC+串口编程之基本概念串口编程之基本概念 引言引言 在 PC 机的主板上,有一种类型的接口可能为我们所忽视,那就是 RS-232C 串行接口,在微软的 Windows 系统中称其为 COM。我们可以通过设备管理器来查看 COM 的硬件参数设置,如图 1。图 1 在 Windows 上查看 PC 串口设置 迄今为止,几乎每一台 PC 都包含 COM。本质而言,COM 是 PC 为和外界通信所提供的一种串行数据传输的接口。作为一种物理通信的途径和设备,它和目前风靡的另一种串行接口USB 所提供的功能是一致的。不过 RS-232C 显然已经开始被后起之秀 USB 赶超,因为 USB 的传输速率已经远远超过了 RS-232C。尽管如此,RS-232C 仍然具有非常广泛的应用,在相对长的一段时间里,难以被 USB 等接口取代。RS-232C 接口(又称 EIA RS-232C),1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定,全名是数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准。本文将对这一接口进行硬件原理的介绍,随后我们将逐章学习 DOS 平台的串口编程,及 Windows 平台下基于 API、控件和第三方类的串口编程,最后本文将给出一个综合实例。硬件原理硬件原理 众所周知,CPU 与存储芯片和 I/O 芯片的通信是并行的(并行传输的最大位数依赖于 CPU 的字长、数据总线的宽度),一种叫做 UART(通用异步收发器,Universal Asynchronous Receiver/Transmitter)的芯片提供了并行数据传输和 RS-232C 串行数据传输方式的转换。这样的设备通常有如图 2 所示的管脚分布,当其向外传输数据时,CPU 并行的将数据写入这类芯片的寄存器,UART 再将寄存器中的数据一位一位地移动并向外传输;当外界向其传输数据时,UART一位一位地接收数据,并将其移位组合为并行数据,CPU 再并行地读取这些数据。实际上,由于 UART 芯片一般以TTL/CMOS 电平工作,在 UART 连接接口之前,还要经过一个 TTL/CMOS 和 RS-232C 电平的转换。RS-232C 规定了其标准的电气特性,逻辑 1 对应的电压必须在-5-15V 之间;逻辑 0 对应的的电压必须在+5+15V 之间。图 2 UART 并/串转换 一个常见的 TTL/CMOS 和 RS-232C 电平转换芯片如图 3。图 3 常见的 TTL/CMOS 和 RS-232C 电平转换芯片 RS-232C 通常以两类接插件与外界相连,分别称为 DB9 和 DB25,如图 4 所示。图 4 DB9 和 DB25 而接插件中各个针的定义则如表 1:表 1 DB9 和 DB25 引脚定义 DB9 DB25 针号 功能说明 缩写 针号 功能说明 缩写 1 数据载波检测 DCD 8 数据载波检测 DCD 2 接收数据 RXD 3 接收数据 RXD 3 发送数据 TXD 2 发送数据 TXD 4 数据终端准备 DTR 20 数据终端准备 DTR 5 信号地 GND 7 信号地 GND 6 数据设备准备好 DSR 6 数据准备好 DSR 7 请求发送 RTS 4 请求发送 RTS 8 清除发送 CTS 5 清除发送 CTS 9 振铃指示 DELL 22 振铃指示 DELL RS-232C 定义为数据通信设备(DCE)和数据终端设备(DTE)之间的互连,实现上,到现在为止,究竟一个设备属于 DCE 还是属于 DTE 已经没有明显的界限,PC 即可作为 DCE,又可作为 DTE。两串口互连,连接方法主要有二:一种方法是,数据的发送和接收由软件控制,不进行硬件握手,其连接方法如图 5(最常用 DB9 连接示意)和表 2(DB9、DB25 三线连接表),真正需要互相连接的是 RXD、TXD 和 GND;调试工具调试工具 在 MS-DOS 下使用的编程环境是 TC 2.0;在 Windows 2000 下的编程环境是 VC+6.0;借助工具:串口调试助手 2.1(图 8)。图 8 串口调试助手 串口调试助手是由Visual C+/Turbo C 串口通信编程实践一书作者龚建伟编写的共享软件,可以方便地进行串口上的数据收发、显示(16 进制和 ASCII 码方式)和串口参数的设置,在串口调试领域应用广泛。串口调试助手的开发原理很简单(相信读者看完本文后在相当短的时间之内就能开发出这样的软件),但是作者龚建伟敏锐地抓住了串口调试在业界的需求,使得自身随这一软件而成名。这一事件或多或少会给程序员们一定的启发。优秀的共享软件不一定要技术含量高,只要有需求,哪怕是开发原理再简单,都能拥有广泛的使用者。为了在一台 PC 上同时搭建 DOS 和 Windows 平台,我们应该在 Windows 平台上安装虚拟 PC 的软件 VmWare(图9,VMware Inc.版权所有,http:/)。VMware 的确是天才的作品!在同一 PC 上,利用 VmWare 几乎可以安装所有的操作系统,而且操作系统之间的切换不需要重新启动电脑,与传统的 LILO 等多系统引导方式有本质的不同。VM 的意义是 Virtual Machine,即虚拟出一个逻辑的电脑。图 9 VmWare 虚拟 PC 在虚拟 PC 的 MS-DOS 操作系统上,我们安装 TC 2.0 开发环境。如果您的 PC 上没有软驱,为了制作 MS-DOS 启动软盘,请安装 RamDiskNT 模拟一个软盘,并在其上安装 MS-DOS启动程序。RamDiskNT 是一个磁盘模拟软件,其界面如图 10 所示。图 10 磁盘模拟 深入浅出深入浅出 VC+串口编程之串口编程之 DOS 的串口编程的串口编程 在 DOS 平台下,操作串口主要有下列方式:通过 BIOS 调用、通过串口的硬件中断或通过对串口硬件进行轮询,本章将对以上三种方式进行具体的介绍并给出例子。1.BIOS 中断 在 DOS 操作系统下,IBM PC 及其兼容机提供了一种灵活的串口 I/O 访问方法,即通过 INT 14H 调用 ROM BIOS串行通讯例行程序。当设置 AH 为不同的值时,产生不同的功能:AH 0 初始化端口 AH 1 向串口写字符 AH 2 从串口读字符 AH 3 取通讯口状态 初始化端口时(即当 AH0 时),需要在 AL 寄存器中赋一字节初始化参数,其各项意义如图 1;图 1 调用 INT 14H 时 AL 寄存器设置 当向串口写字符时(即当 AH1 时),AL 寄存器中的字符是需要写入的字符;当向串口写字符时(即当 AH2 时),AL 寄存器中的字符是需要读取的字符。看看下面的例程:#include#include#include#define STR author:sbh union REGS inregs,outregs;main()/设置串口参数 init_rs232();/写串口的例子 write_rs232(STR,strlen(STR);/读串口的例子 read_rs232();return(0);init_rs232()do inregs.h.ah=0;/AH=0 表示初始化端口 inregs.h.al=0 xe7;inregs.x.dx=0;/COM1 int86(0 x14,&inregs,&outregs);while(outregs.h.ah=0 x80);return(0);write_rs232(char*string,int len)int i;do inregs.h.ah=1;/发送 AL 寄存器的字符 inregs.h.al=*string;inregs.x.dx=0;int86(0 x14,&inregs,&outregs);while(outregs.h.al=0 x80);for(i=1;i=0 x80);return(0);其中使用的 int86 函数的原型为:int _Cdecl int86(int intno,union REGS*inregs,union REGS*outregs);int86()函数可以调用 BIOS 功能,现在的程序员们已经很少接触这个函数,80%的程序员甚至都未曾见过这个函数。其实,在茹毛饮血的 DOS 时代,int86()函数几乎是最常用和最核心的函数之一。几乎可以说,在那个时代,不会 int86()就等于不会编程。而与 int86 配合使用的,就是 REGS 这样一个联合体,定义为:union REGS struct WORDREGS x;struct BYTEREGS h;其中的 WORDREGS 定义为:struct WORDREGS unsigned int ax,bx,cx,dx,si,di,cflag/*进位标志*/,flags/*标志寄存器*/;而 BYTEREGS 则定义为:struct BYTEREGS unsigned char al,ah,bl,bh,cl,ch,dl,dh;原来 WORDREGS 和 BYTEREGS 是 16 位的 8086 处理器内部的寄存器啊!因此,当 CPU 发展到 286、386 以后,再安装 DOS 也是建立在利用 CPU 实模式的基础上的!另外一个函数与 int86()的功能是类似的:Int _Cdecl int86x(int intno,union REGS inregs,union REGS outregs,struct SREGS segregs);其中的 SREGS 为段寄存器结构体,定义为:struct SREGS unsigned int es;unsigned int cs;unsigned int ss;unsigned int ds;int86 和 int86x 这两个函数的功能都是执行一个由参数 intno 指定的 8086 软中断。在执行软中断之前,两个函数都把 inregs 中的内容放置到各寄存器中(int86x 还把 segregs.x.es 和 segregs.x.ds 的值存到相应的段寄存器中),软中断返回后,这两个函数都把当前寄存器的值存到 outregs,并把系统进位标志拷贝到 outregs.s.cflag 中,把 8086 标志寄存器值存到 outregs.x.flag 中(int86x 还恢复 DS,并设置 Segregs.es 和 Segregs.ds 的值为对应段寄存器的值)。查阅 BIOS 中断调用手册,发现绝大多数调用都未用到 ES 和 DS 段寄存器,故在程序设计中经常只利用了 int86 函数。2.硬件中断 为了给读者一个直观的印象,我们通过在 Windows 操作系统中查看 COM 的资源属性获得某 COM 对应的中断号,如图 2(该对话框中设备管理器中开启)。图 2 COM 中断号 实际上 COM 的确直接对应于一个中断,而系统也按照一定的规律为各类硬件分配了一个较固定的中断号,如表 1。表 1 中断向量表 INT(Hex)IRQ Common Uses 08 0 System Timer 09 1 Keyboard 0A 2 Redirected 0B 3 Serial Comms.COM2/COM4 0C 4 Serial Comms.COM1/COM3 0D 5 Reserved/Sound Card 0E 6 Floppy Disk Controller 0F 7 Parallel Comms.70 8 Real Time Clock 71 9 Reserved 72 10 Reserved 73 11 Reserved 74 12 PS/2 Mouse 75 13 Maths Co-Processor 76 14 Hard Disk Drive 77 15 Reserved 通过编写 COM 对应的中断服务程序,我们也可以操作串口,涉及到的相关函数有:(1)设置中断向量表/*dos.h*/void _Cdecl setvect(int interruptno,void interrupt(*isr)();例如,COM3 对应的中断号是 4,那么对应中断向量表中的地址是 0 x0C,设置 0 x0C 对应中断程序的函数为:setvect(0 x0C,PORT1INT);其中的中断服务程序 PORT1INT 为:void interrupt PORT1INT()int c;do c=inportb(PORT1+5);if(c&1)bufferbufferin=inportb(PORT1);bufferin+;if(bufferin=1024)bufferin=0;while(c&1);outportb(0 x20,0 x20);上述中断服务程序检查是否有字符可接收,其后将其通过 inportb(PORT1)语句将其从 UART 中读出并放入输入buffer。持续的检查 UART,以便能在一次中断里读取所有可获得的数据。最后的outportb(0 x20,0 x20);语句告诉可编程中断控制器(Programmable Interrupt Controller,PIC)中断已经完成。(2)读取中断向量表/*dos.h*/void interrupt(*_Cdecl getvect(int interruptno)();例如:oldport1isr=getvect(INTVECT);其中的 oldport1isr 定义为:void interrupt(*oldport1isr)();我们融合 setvect()函数、中断服务程序和 getvect()函数,给出一个由 Craig Peacock 编写的完备例程:/*Name:Sample Comms Program-1024 Byte Buffer-buff1024.c*/*Written By:Craig Peacock */#include#include#include#define PORT1 0 x3F8/*Port Address Goes Here*/#define INTVECT 0 x0C/*Com Ports IRQ here(Must also change PIC setting)*/*Defines Serial Ports Base Address*/*COM1 0 x3F8*/*COM2 0 x2F8*/*COM3 0 x3E8*/*COM4 0 x2E8*/int bufferin=0;int bufferout=0;char ch;char buffer1025;void interrupt(*oldport1isr)();void interrupt PORT1INT()/*Interrupt Service Routine(ISR)for PORT1*/int c;do c=inportb(PORT1+5);if(c&1)bufferbufferin=inportb(PORT1);bufferin+;if(bufferin=1024)bufferin=0;while(c&1);outportb(0 x20,0 x20);void main(void)int c;outportb(PORT1+1,0);/*Turn off interrupts-Port1*/oldport1isr=getvect(INTVECT);/*Save old Interrupt Vector of later recovery*/setvect(INTVECT,PORT1INT);/*Set Interrupt Vector Entry*/*COM1-0 x0C*/*COM2-0 x0B*/*COM3-0 x0C*/*COM4-0 x0B*/*PORT 1-Communication Settings*/outportb(PORT1+3,0 x80);/*SET DLAB ON*/outportb(PORT1+0,0 x0C);/*Set Baud rate-Divisor Latch Low Byte*/*Default 0 x03=38,400 BPS*/*0 x01=115,200 BPS*/*0 x02=57,600 BPS*/*0 x06=19,200 BPS*/*0 x0C=9,600 BPS*/*0 x18=4,800 BPS*/*0 x30=2,400 BPS*/outportb(PORT1+1,0 x00);/*Set Baud rate-Divisor Latch High Byte*/outportb(PORT1+3,0 x03);/*8 Bits,No Parity,1 Stop Bit*/outportb(PORT1+2,0 xC7);/*FIFO Control Register*/outportb(PORT1+4,0 x0B);/*Turn on DTR,RTS,and OUT2*/outportb(0 x21,(inportb(0 x21)&0 xEF);/*Set Programmable Interrupt Controller*/*COM1(IRQ4)-0 xEF*/*COM2(IRQ3)-0 xF7*/*COM3(IRQ4)-0 xEF*/*COM4(IRQ3)-0 xF7*/outportb(PORT1+1,0 x01);/*Interrupt when data received*/printf(nSample Comms Program.Press ESC to quit n);do if(bufferin!=bufferout)ch=bufferbufferout;bufferout+;if(bufferout=1024)bufferout=0;printf(%c,ch);if(kbhit()c=getch();outportb(PORT1,c);while(c!=27);outportb(PORT1+1,0);/*Turn off interrupts-Port1*/outportb(0 x21,(inportb(0 x21)|0 x10);/*MASK IRQ using PIC*/*COM1(IRQ4)-0 x10*/*COM2(IRQ3)-0 x08*/*COM3(IRQ4)-0 x10*/*COM4(IRQ3)-0 x08*/setvect(INTVECT,oldport1isr);/*Restore old interrupt vector*/3.硬件查询 通过读取和写入串口 UART 对应的硬件端口,我们可以控制串口的收发。请看下面的例子:/*Name:Sample Comms Program-Polled Version-termpoll.c*/*Written By:Craig Peacock */#include#include#include#define PORT1 0 x3F8 /*Defines Serial Ports Base Address*/*COM1 0 x3F8*/*COM2 0 x2F8*/*COM3 0 x3E8*/*COM4 0 x2E8*/void main(void)int c;int ch;outportb(PORT1+1,0);/*Turn off interrupts-Port1*/*PORT 1-Communication Settings*/outportb(PORT1+3,0 x80);/*SET DLAB ON*/outportb(PORT1+0,0 x03);/*Set Baud rate-Divisor Latch Low Byte*/*Default 0 x03=38,400 BPS*/*0 x01=115,200 BPS*/*0 x02=57,600 BPS*/*0 x06=19,200 BPS*/*0 x0C=9,600 BPS*/*0 x18=4,800 BPS*/*0 x30=2,400 BPS*/outportb(PORT1+1,0 x00);/*Set Baud rate-Divisor Latch High Byte*/outportb(PORT1+3,0 x03);/*8 Bits,No Parity,1 Stop Bit*/outportb(PORT1+2,0 xC7);/*FIFO Control Register*/outportb(PORT1+4,0 x0B);/*Turn on DTR,RTS,and OUT2*/printf(nSample Comms Program.Press ESC to quit n);do c=inportb(PORT1+5);/*Check to see if char has been*/*received.*/if(c&1)ch=inportb(PORT1);/*If so,then get Char*/printf(%c,ch);/*Print Char to Screen*/if(kbhit()ch=getch();/*If key pressed,get Char*/outportb(PORT1,ch);/*Send Char to Serial Port*/while(ch!=27);/*Quit when ESC(ASC 27)is pressed*/程序中的 c=inportb(PORT1+5);/*Check to see if char has been*/*received.*/if(c&1)检查 PORT1+5 端口地址,通过 c&1 可以判断是否有数据被 UART 接收到。关于 UART 对应的端口范围,从图 2中也可以直观地看出。深入浅出深入浅出 VC+串口编程之基于串口编程之基于 Win32 API 1、API 描述 在 WIN32 API 中,串口使用文件方式进行访问,其操作的 API 基本上与文件操作的 API 一致。打开串口 Win32 中用于打开串口的 API 函数为 CreateFile,其原型为:HANDLE CreateFile(LPCTSTR lpFileName,/将要打开的串口逻辑名,如 COM1 或 COM2 DWORD dwAccess,/指定串口访问的类型,可以是读取、写入或两者并列 DWORD dwShareMode,/指定共享属性,由于串口不能共享,该参数必须置为 0 LPSECURITY_ATTRIBUTES lpsa,/引用安全性属性结构,缺省值为 NULL DWORD dwCreate,/创建标志,对串口操作该参数必须置为 OPEN EXISTING DWORD dwAttrsAndFlags,/属性描述,用于指定该串口是否可进行异步操作,/FILE_FLAG_OVERLAPPED:可使用异步的 I/O HANDLE hTemplateFile/指向模板文件的句柄,对串口而言该参数必须置为 NULL);例如,以下程序用于以同步读写方式打开串口 COM1:HANDLE hCom;DWORD dwError;hCon=CreateFile(COM1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(hCom=(HANDLE)0 xFFFFFFFF)dwError=GetLastError();MessageBox(dwError);对于 dwAttrsAndFlags 参数及 FILE_FLAG_OVERLAPPED 标志的由来,可解释如下:Windows 文件操作分为同步 I/O 和重叠 I/O(Overlapped I/O)两种方式,在同步 I/O 方式中,API 会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而在重叠 I/O 方式中,API 会立即返回,操作在后台进行,避免线程的阻塞。重叠 I/O 非常灵活,它也可以实现阻塞(例如我们可以设置一定要读取到一个数据才能进行到下一步操作)。如果进行 I/O 操作的 API 在没有完成操作的情况下返回,我们可以通过调用 GetOverLappedResult()函数阻塞到 I/O操作完成后返回。配置串口 配置串口是通过改变设备控制块 DCB(Device Control Block)的成员变量值来实现的,接收缓冲区和发送缓冲区的大小可通过 SetupComm 函数来设置。DCB 结构体定义为:typedef struct _DCB /dcb DWORD DCBlength;/sizeof(DCB)DWORD BaudRate;/current baud rate DWORD fBinary:1;/binary mode,no EOF check DWORD fParity:1;/enable parity checking DWORD fOutxCtsFlow:1;/CTS output flow control DWORD fOutxDsrFlow:1;/DSR output flow control DWORD fDtrControl:2;/DTR flow control type DWORD fDsrSensitivity:1;/DSR sensitivity DWORD fTXContinueOnXoff:1;/XOFF continues Tx DWORD fOutX:1;/XON/XOFF out flow control DWORD fInX:1;/XON/XOFF in flow control DWORD fErrorChar:1;/enable error replacement DWORD fNull:1;/enable null stripping DWORD fRtsControl:2;/RTS flow control DWORD fAbortOnError:1;/abort reads/writes on error DWORD fDummy2:17;/reserved WORD wReserved;/not currently used WORD XonLim;/transmit XON threshold WORD XoffLim;/transmit XOFF threshold BYTE ByteSize;/number of bits/byte,4-8 BYTE Parity;/0-4=no,odd,even,mark,space BYTE StopBits;/0,1,2=1,1.5,2 char XonChar;/Tx and Rx XON character char XoffChar;/Tx and Rx XOFF character char ErrorChar;/error replacement character char EofChar;/end of input character char EvtChar;/received event character WORD wReserved1;/reserved;do not use DCB;而 SetupComm 函数的原型则为:BOOL SetupComm(HANDLE hFile,/handle to communications device DWORD dwInQueue,/size of input buffer DWORD dwOutQueue/size of output buffer);以下程序将串口设置为:波特率为 9600,数据位数为 7 位,停止位为 2 位,偶校验,接收缓冲区和发送缓冲区大小均为 1024 个字节,最后用 PurgeComm 函数终止所有的后台读写操作并清空接收缓冲区和发送缓冲区:DCB dcb;dcb.BaudRate=9600;/波特率为 9600 dcb.ByteSize=7;/数据位数为 7 位 dcb.Parity=EVENPARITY;/偶校验 dcb.StopBits=2;/两个停止位 dcb.fBinary=TRUE;dcb.fParity=TRUE;if(!SetCommState(hCom,&dcb)MessageBox(串口设置出错!);SetupComm(hCom,1024,1024);PurgeComm(hCom,PURCE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);超时设置 超时设置是通过改变 COMMTIMEOUTS 结构体的成员变量值来实现的,COMMTIMEOUTS 的原型为:typedef struct _COMMTIMEOUTS DWORD ReadIntervalTimeout;/定义两个字符到达的最大时间间隔,单位:毫秒 /当读取完一个字符后,超过了 ReadIntervalTimeout,仍未读取到下一个字符,就会 /发生超时 DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutConstant;/其中各时间所满足的关系如下:/ReadTotalTimeout=ReadTotalTimeOutMultiplier*BytesToRead+ReadTotalTimeoutConstant DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutConstant;COMMTIMEOUTS,*LPCOMMTIMEOUTS;设置超时的函数为 SetCommTimeouts,其原型中接收 COMMTIMEOUTS 的指针为参数:BOOL SetCommTimeouts(HANDLE hFile,/handle to communications device LPCOMMTIMEOUTS lpCommTimeouts/pointer to comm time-out structure);以下程序将串口读操作的超时设定为 10 毫秒:COMMTIMEOUTS to;memset(&to,0,sizeof(to);to.ReadIntervalTimeout=10;SetCommTimeouts(hCom,&to);与 SetCommTimeouts 对应的 GetCommTimeouts()函数的原型为:BOOL GetCommTimeouts(HANDLE hFile,/handle of communications device LPCOMMTIMEOUTS lpCommTimeouts/pointer to comm time-out structure);事件设置 在读写串口之前,需要用 SetCommMask()函数设置事件掩模来监视指定通信端口上的事件,其原型为:BOOL SetCommMask(HANDLE hFile,/标识通信端口的句柄 DWORD dwEvtMask/能够使能的通信事件);有了 Set 当然还会有 Get,与 SetCommMask 对应的 GetCommMask()函数的原型为:BOOL GetCommMask(HANDLE hFile,/标识通信端口的句柄 LPDWORD lpEvtMask/address of variable to get event mask);串口上可以发生的事件可以是如下事件列表中的一个或任意组合:EV_BREAK、EV_CTS、EV_DSR、EV_ERR、EV_RING、EV_RLSD、EV_RXCHAR、EV_RXFLAG、EV_TXEMPTY。我们可以用 WaitCommEvent()函数来等待串口上我们利用 SetCommMask()函数设置的事件:BOOL WaitCommEvent(HANDLE hFile,/标识通信端口的句柄 LPDWORD lpEvtMask,/address of variable for event that occurred LPOVERLAPPED lpOverlapped,/address of overlapped structure);WaitCommEvent()函数一直阻塞,直到串口上发生我们用所 SetCommMask()函数设置的通信事件为止。一般而言,当 WaitCommEvent()返回时,程序员可以由分析*lpEvtMask 而获得发生事件的类别,再进行相应的处理。读串口 对串口进行读取所用的函数和对文件进行读取所用的函数相同,读函数原型如下:BOOL ReadFile(HANDLE hFile,/handle of file to read LPVOID lpBuffer,/pointer to buffer that receives data DWORD nNumberOfBytesToRead,/number of bytes to read LPDWORD lpNumberOfBytesRead,/pointer to number of bytes read LPOVERLAPPED lpOverlapped/pointer to structure for overlapped I/O);写串口 对串口进行写入所用的函数和对文件进行写入所用的函数相同,写函数原型如下:BOOL WriteFile(HANDLE hFile,/handle to file to write to LPCVOID lpBuffer,/pointer to data to write to file DWORD nNumberOfBytesToWrite,/number of bytes to write LPDWORD lpNumberOfBytesWritten,/pointer to number of bytes written LPOVERLAPPED lpOverlapped/pointer to structure for overlapped I/O);关闭串口 利用API 函数实现串口通信时关闭串口非常简单,只需使用CreateFile 函数返回的句柄作为参数调用CloseHandle 即可:BOOL CloseHandle(HANDLE hObject/handle to object to close);2.例程 在笔者的深入浅出 Win32 多线程程序设计之综合实例中我们已经给出一个利用 WIN API 进行串口通信的例子,这里再给出一个类似的例子,以进一步加深理解。对话框上控件对应的资源文件(.RC)中的内容如下:BEGIN EDITTEXT IDC_RECV_EDIT,28,119,256,46,ES_AUTOHSCROLL GROUPBOX 发送数据,IDC_STATIC,19,15,282,70 GROUPBOX 接收数据,IDC_STATIC,19,100,282,80 EDITTEXT IDC_SEND_EDIT,29,33,214,39,ES_AUTOHSCROLL PUSHBUTTON 清除,IDC_CLEAR_BUTTON,248,33,50,14 PUSHBUTTON 发送,IDC_SEND_BUTTON,248,55,50,14 END 而整个对话框的消息映射(描述了消息及其对应的行为)如下:BEGIN_MESSAGE_MAP(CSerialPortAPIDlg,CDialog)/AFX_MSG_MAP(CSerialPortAPIDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_CLEAR_BUTTON,OnClearButton)ON_BN_CLICKED(IDC_SEND_BUTTO

    注意事项

    本文(VC++串口编程.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开