VC串口编程API详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-
V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。
1.打开串口
HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess,
DWORDdwShareMode,
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
DWORDdwCreationDistribution,
DWORDdwFlagsAndAttributes,
HANDLEhTemplateFile);
参数:
lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;
dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;
dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;
dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式;
hTemplateFile:对串口而言该参数必须置为NULL;
2.获取串口设备控制块DCB
BOOLGetCommState(
HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄
LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针
);
3.设置串口设备控制块DCB
BOOLSetCommState(
HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针
);
4.设置串口输入输出缓冲区大小
BOOLSetupComm(
HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)
);
5.清空读写缓冲区内容
BOOLPurgeComm(
HANDLEhFile, //串口句柄
DWORDdwFlags //需要完成的操作
);
参数dwFlags指定要完成的操作,可以是下列值的组合:
PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
PURGE_TXCLEAR 清除输出缓冲区
PURGE_RXCLEAR 清除输入缓冲区
6.超时时间获取与设置
BOOLGetCommTimeouts( //获取串口超时设置HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。);
BOOLSetCommTimeouts(//设置串口超时时间
HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。);
COMMTIMEOUTS结构的定义为:
typedefstruct_COMMTIMEOUTS{
DWORDReadIntervalTimeout;//读间隔超时,单位ms DWORDReadTotalTimeoutMultiplier;//读时间系数,单位ms DWORDReadTotalTimeoutConstant;//读时间常量,单位ms DWORDWriteTotalTimeoutMultiplier;//写时间系数,单位ms DWORDWriteTotalTimeoutConstant;//写时间常量,单位ms
}COMMTIMEOUTS,*LPCOMMTIMEOUTS;
参数详解:
·ReadIntervalTimeout:以ms为单位指定通信线路上两个字符到达之间的最大时间间隔。在ReadFile()操作期间,从接收到第一个字符时开始计时。如果任意两个字符到达之间的时间间隔超过这个最大值,则ReadFile()操作完成,并返回缓冲数据。如果被置为0,则表示不使用间隔超时。
Windows使用下面的式子计算总超时时间:
ReadTotalTimeout=(ReadTotalTimeoutMultiplier*bytes_to_read)+Rea dTotalTimeoutConstant;
WriteTotalTimeout=(WriteTotalTimeoutMultiplier*bytes_to_write)+ WriteTotalTimeoutConstant;
超时有两种类型。第一种类型叫区间超时(intervaltimeout),它仅适应于从端口读取数据
它指定在读取两个字符之间要经历多长时间。接收一个字符时,Windows 就启动一个内部计
时器。在下一个字符到达之前,如果定时器超过了区间超时设定时间,读函数就会放弃。第
二种类型的超时叫做总超时(totaltimeout),它适于读和写端口。当读或写特定字节数需
要的总时间超过某一阈值时,该超时即被触发。
当超时的常数和系数都设置为0,则没有总超时时间。如果读间隔超时被设置成MAXDWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回而不管是否读入了要求的字符。
在用异步方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。
7.关闭串口
BOOLCloseHandle(