实作时拿来查就好!
1、CreateFile() ——打开串口& CloseHandle()——关闭串口,成功关闭返回true
HANDLE CreateFile(LPCTSTR lpFileName ,DWORD dwDesireAccess ,DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes ,DWORD dwCreationDistribution ,
DWORD dwFlagsAndAttributes ,HANDLE hTemplateFile);
BOOL CloseHandle(HANDLE hObjedt) ;
lpFileName 要打开的设备文件名称,对串口通信来说就是COM1或COM2
dwDesiredAccess 读/写模式设置,一般为GENERIC_READ 或 GENERIC_WRITE
dwShareMode 串口共享模式,一般不允许与其他应用程序共享,设为0
lpSecurityAttributes 串口的安全属性,应为0,表示该串口不可被子程序继承
dwCreationDistribution 创建文件的性质,一般标识为OPEN_EXISTING
dwFlagsAndAttributes 属性及相关标志,若用异步方式应1设为FILE_FLAG_OVERLAPPED
hTemplateFile 模板文件指定,一般为0,选定为默认值
串口打开成功方可使用。CreateFile函数返回操作串口的句柄,可供以后对串口操作使用。
GetCommState()——取得串口的工作状态和 SetCommState()——设置串口的工作状态
BOOL GetCommState(HANDLE hFile,LPDCB lpDCB);
BOOL SetCommState(HANDLE hFile ,LPDCB lpDCB);
hFile表示串口句柄,lpDCB表示特定的设备控制块DCB(Device Control Block)。DCB结构中含有设备相关的参数,如数据位数、起止/校验和波特率等。初始化串口时一般先用GetCommState()取得串口的参数结构,修改部分参数后再调用SetCommState()将参数结构写入DCB
DCB中进行串口初始化设置相关的几个常用参数:
DWORD BaudRate 串口波特率
DWORD fParity 为1时激活奇偶校验
DWORD Parity 校验方式,0~4分别对应无校验,奇校验,偶校验,校验置位和校验清零
DWORD ByteSize 一个字节的数据位个数,范围是5~8
DWORD StopBits 停止位个数,0~2分别对应1位、1.5位、2位停止位
GetCommTimeouts()——取得串口收发的超时时间和SetCommTimeouts()——设置串口收发的超时时间
两个函数主要通过改变COMMTIMEOUTS结构体的成员变量值来实现
BOOL GetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile ,LPCOMMTIMEOUTS lpCommTimeouts);
COMMTIMEOUTS 结构用于表示读/写操作相关的时间限制
typedef struct _COMMTIMEOUTS
{
DWORD ReadIntervalTimeout ;//两个字符到达的最大时间间隔,单位为ms
DWORD ReadTotalTimeoutMultiplier ;//读操作一个字符的时间值
DWORD ReadTotalTimeoutConstant ;//读操作的时间限定值
DWORD WriteTotalTimeoutMultiplier ;//写操作一个字符的时间值
DWORD WriteTotalTimeoutConstant ;//写操作的时间限定值
} COMMTIMEOUTS ,*LPCOMMTIMEOUTS ;
其中 ReadTotalTimeout = ReadTotalTimeoutMultiplier *BytesToRead +ReadTotalTimeoutComnstant
WriteTotalTimeout =WriteTotalTimeoutMultiplier * BytesToWrite + WriteTotalTimeoutConstant
读完一个字符后,超过了ReadIntervalTimeout ,仍未读取到下一个字符,发生超时事件
读或写操作时间超过上述式子中的设定值,发生超时事件
SetupComm()——设置数据缓冲区大小 和 PurgeComm()——清零数据缓冲区
BOOL SetuoComm(HANDLE hFile ,DWORD dwInQueue ,DWORD dwOutQueue);
BOOL PurgeComm(HANDLE hFile ,DWORD dwFlags) ;
dwInQueue——接收缓冲区的字节长度
dwOutQueue——发送缓冲区的字节长度
dwFlags——指定对串口执行的动作
常用的dwFlags标识:
PURGE_TXABORT——停止目前所有的传输工作,立即返回,不管是否完成传输动作
PURGE_RXABORT ——停止目前所有的读取工作,立即返回,不管是否完成读取动作
PURGE_TXCLEAR——清除发送缓冲区的所有数据
PURGE_RXCLEAR——清除接收缓冲区的所有数据
ReadFile() ——读串口操作 和WriteFile()——写串口操作
BOOL ReadFile(HANDLE hFile ,LPVOID lpBuffer ,DWORD nNumberOfBytesToRead ,
LPDWORD lpNumberOfBytesRead , LPOVERLAPPED lpOverlapped );
BOOL WriteFile( HANDLE hFile ,LPCVOID lpBuffer ,DWORD nNumberOfBytesToWrite ,
LPDWORD lpNumberOfBytesWritten ,LPOVERLAPPED lpOverlapped);
lpBuffer——等待读或写数据的首地址 ;nNumberOfBytesToRead 等待读的字节数长度
nNumberOfBytesToWrite 等待写的字节数长度
lpNumberOfBytesRead 从串口实际读出的字节个数
lpNumberOfBytesWritten 实际写入串口的数据个数
lpOverlapped 指向一个可重叠型I/O结构的指针
ClearCommError()——清除串口错误或读取串口当前的状态
BOOL ClearCommError(HANDLE hFile ,LPDWORD lpErrors ,LPCOMATAT lpStat );
lpError 返回的错误数值
常见的错误常数定义:
CE_BPEAK 检测到某个字节数据缺少合法的停止位
CE_FRAME 硬件1检测到帧错误
CE_IOE 通信设备发生输入/输出错误
CE_MODE 设置模式错误,或是hFile值错误
CE_OVERRUN 溢出错误,缓冲区容量不足,数据将丢失
CE_RXOVER 溢出错误
CE_RXPARITY 硬件检查到校验位错误
CE_TXFULL 发送缓冲区已满
lpStat 指向通信端口状态的结构变量 COMSTAT
typedef struct _COMSTAT
{
......
DWORD cbInQue ;//输入缓冲区的字节数
DWORD cbOutQue ;//输出缓冲区的字节数
}COMSTAT ,*LPCOMSTAT ;
GetCommMask() 、SetCommMask() WaitCommEvent ()
获得、设置、等待串行端口上指定监视事件
BOOL GetCommMask(HANDLE hFile ,LPDWORD lpEvtMask );
BOOL SetCommMask(HANDLE hFile ,DWORD dwEvtMask );
BOOL WaitCommEvent (HANDLE hFile ,LPDWORD lpEvtMask ,LPOVERLAPPED lpOverlapped );
lpEvtMask 准备监视的串口事件掩码,可以是以下一个或几个定义事件的组合:
EV_BREAK 收到Break信号
EV_CTS CTS(Clear to Send )线路状态发生变化
EV_DSR DSR(Data Set Ready )线路状态发生变化
EV_ERR 线路状态错误,包括CE_FRAME、CE_OVERRUN 、CE_RXPARRITY 3种错误
EV_RING 检测到振铃信号
EV_RLSD CD(Carrier Detect)线路信号发生变化
EV_RXCHAR 输入缓冲区中已收到数据
EV_RXFLAG 使用SetCommState()函数设置DCB结构中的等待字符已被传入输入缓冲区
EV_TXEMPTY 输出缓冲区中的数据已被完全送出
lpOverlapped 用于在异步通信时保存异步操作结果