串口编程的一般步骤及相关函数讲解串口函数

上传人:Wo****C 文档编号:216151977 上传时间:2021-11-28 格式:DOC 页数:26 大小:42.50KB
返回 下载 相关 举报
串口编程的一般步骤及相关函数讲解串口函数_第1页
第1页 / 共26页
串口编程的一般步骤及相关函数讲解串口函数_第2页
第2页 / 共26页
串口编程的一般步骤及相关函数讲解串口函数_第3页
第3页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《串口编程的一般步骤及相关函数讲解串口函数》由会员分享,可在线阅读,更多相关《串口编程的一般步骤及相关函数讲解串口函数(26页珍藏版)》请在金锄头文库上搜索。

1、串口编程的一般步骤及相关函数讲解 串口函数用Windows API进行串口编程的一般步骤及相关函数讲解-分隔线-虽然使用诸如 CSerialPort VC串口类,MSm VC 串口控件等非常方便,但有时这些控件并不适合自己的特殊需求,所以有必要了解一下基于Windows API的串口编程方法,下面介绍一下API串口编程的一般步骤及相关串口API函数。串口操作一般有四步,分别是:1) 打开串口2) 配置串口3) 读写串口4) 关闭串口、 打开串口在VC 打开串口一文中我们已经单独介绍过如果利用API打开串口的方法,打开串口是用API函数CreateFile来打开或创建的。该函数的原型为:1HAN

2、DLE CreateFile( LPCTSTR lpFileName,2 DWORD dwDesiredAccess,3 DWORD dwShareMode,4 LPSECURITY_ATTRIBUTES lpSecurityAttributes,5 DWORD dwCreationDistribution,6DWORD dwFlagsAndAttributes,7HANDLE hTemplateFile);参数详解:lpFileName:将要打开的串口逻辑名,如“1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串

3、口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_E_ISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;hTemplateFile:对串口而言该参数必须置为NULL;串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(也称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在

4、多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。同步I/O方式打开串口的示例:8HANDLE h; /全局变量,串口句柄9h=CreateFile(“1”,/1口10 GENERIC_READ|GENERIC_WRITE, /允许读和写11 0, /独占方式12 NULL,13 OPEN_E_ISTING, /打开而不是创建14 0, /同步方式15 NULL);16if(h=(HANDLE)-1)1718 Af_MessageBo_(“打开失败!”);19 return FALSE;2021return TRU

5、E;重叠I/O打开串口的示例:22HANDLE h; /全局变量,串口句柄23h =CreateFile(“1”, /1口24 GENERIC_READ|GENERIC_WRITE, /允许读和写25 0, /独占方式26 NULL,27 OPEN_E_ISTING, /打开而不是创建28 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, /重叠方式29 NULL);30if(h =INVALID_HANDLE_VALUE)3132 Af_MessageBo_(“打开失败!”);33 return FALSE;3435 return TRUE;2、配置串口

6、在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。一般用CreateFile打开串口后,可以调用GetmState函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetmState函数设置串口。DCB结构包含了串口的各项参数设置,下面仅介绍几个该结构常用的变量:36typedef struct _DCB37 38 /波特率,指定通信设备的传输速率。这个成员可以是实际波特率值或者下面的常量值之一:39 DWO

7、RD BaudRate;40CBR_110,CBR_300,CBR_600,CBR_120_,CBR_2400,CBR_4800,CBR_9600,CBR_1920_, CBR_38400,41CBR_56000, CBR_57600, CBR_11520_, CBR_128000, CBR_256000, CBR_144004243DWORD fParity; / 指定奇偶校验使能。若此成员为1,允许奇偶校验检查44 45BYTE ByteSize; / 通信字节位数,4846BYTE Parity; /指定奇偶校验方法。此成员可以有下列值:47EVENPARITY 偶校验 NOPARITY

8、 无校验48MARKPARITY 标记校验 ODDPARITY 奇校验49BYTE StopBits; /指定停止位的位数。此成员可以有下列值:50ONESTOPBIT 1位停止位 TWOSTOPBITS 2位停止位51ONE5STOPBITS 1.5位停止位52 53 DCB;54winbase.h文件中定义了以上用到的常量。如下:55#define NOPARITY 056#define ODDPARITY 157#define EVENPARITY 258#define ONESTOPBIT 059#define ONE5STOPBITS 160#define TWOSTOPBITS 2

9、61#define CBR_110 11062#define CBR_300 30063#define CBR_600 60064#define CBR_120_ 120_65#define CBR_2400 240066#define CBR_4800 480067#define CBR_9600 960068#define CBR_14400 1440069#define CBR_1920_ 1920_70#define CBR_38400 3840071#define CBR_56000 5600072#define CBR_57600 5760073#define CBR_11520_

10、 11520_74#define CBR_128000 12800075#define CBR_256000 256000GetmState函数可以获得口的设备控制块,从而获得相关参数:76BOOL GetmState(77 HANDLE hFile, /标识通讯端口的句柄78 LPDCB lpDCB /指向一个设备控制块(DCB结构)的指针79 );80SetmState函数设置口的设备控制块:81BOOL SetmState(82 HANDLE hFile,83 LPDCB lpDCB84 );除了在BCD中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区

11、来暂存串口输入和输出的数据。如果通信的速率较高,则应该设置较大的缓冲区。调用Setupm函数可以设置串行口的输入和输出缓冲区的大小。85BOOL Setupm(8687 HANDLE hFile, / 通信设备的句柄88 DWORD dwInQueue, / 输入缓冲区的大小(字节数)89 DWORD dwOutQueue / 输出缓冲区的大小(字节数)90 );在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile或WriteFile的操作仍然会结束。要查询当前的超时设置应调用GetmTimeouts函

12、数,该函数会填充一个MTIMEOUTS结构。调用SetmTimeouts可以用某一个MTIMEOUTS结构的内容来设置超时。读写串口的超时有两种:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延。总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用MTIMEOUTS结构可以规定读写操作的超时。MTIMEOUTS结构的定义为:91typedef struct _MTIMEOUTS 92 DWORD ReadIntervalTimeout; /读间隔超时93 DWORD ReadTotalTimeoutMultiplier; /读时间系数94 DWORD

13、 ReadTotalTimeoutConstant; /读时间常量95 DWORD WriteTotalTimeoutMultiplier; / 写时间系数96 DWORD WriteTotalTimeoutConstant; /写时间常量97 MTIMEOUTS,_LPMTIMEOUTS;MTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:总超时时间系数要求读/写的字符数时间常量例如,要读入10个字符,那么读操作的总超时的计算公式为:读总超时ReadTotalTimeoutMultiplier10ReadTotalTimeoutConstant可以看出:间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时。如果ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为0,则不使用读总超时。如果读间隔超时被设置成MA_DWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回,而不

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号