串口操作之API
1. CreateFile
功能:
主要用来打开和创建文件,也可以用来打开和创建管道、邮槽、通信服务、设备以及控制台缓冲区。
函数原型:
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写/读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
说明:
dwDesiredAccess | GENERIC_READ | 允许对设备进行读访问 |
GENERIC_WRITE | 允许对设备进行写访问 | |
0 | 只允许获取与一个设备有关的信息 | |
dwShareMode | FILE_SHARE_READ | 允许对文件进行共享访问 |
FILE_SHARE_WRITE | 允许对文件进行共享访问 | |
0 | 不共享 | |
dwCreationDisposition | CREATE_NEW | 创建文件;如文件存在则会出错 |
CREATE_ALWAY | 创建文件,会改写前一个文件 | |
OPEN_EXISTING | 文件必须已经存在 | |
OPEN_ALWAYS | 如文件不存在则创建它 | |
TRUNCATE_EXISTING | 现有文件缩短为零长度 | |
dwFlagsAndAttributes | FILE_ATTRIBUTE_ARCHIVE | 标记归档属性 |
FILE_ATTRIBUTE_COMPRESSED | 将文件标记为已压缩 | |
FILE_ATTRIBUTE_NORMAL | 默认属性 | |
FILE_ATTRIBUTE_HIDDEN | 隐藏文件或目录 | |
FILE_ATTRIBUTE_READONLY | 文件为只读 | |
FILE_ATTRIBUTE_SYSTEM | 文件为系统文件 | |
FILE_FLAG_WRITE_THROUGH | 系统不得推迟对文件的写操作 | |
FILE_FLAG_OVERLAPPED | 允许对文件进行重叠操作 | |
FILE_FLAG_NO_BUFFERING | 禁止对文件进行缓冲处理 | |
FILE_FLAG_RANDOM_ACCESS | 针对随机访问对文件缓冲进行优化 | |
FILE_FLAG_SEQUENTIAL_SCAN | 针对连续访问对文件缓冲进行优化 | |
FILE_FLAG_DELETE_ON_CLOSE | 关闭了上一次打开的句柄后,将文件删除 |
返回文件句柄为INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
用法举例:
HANDLE hCom;
hCom = CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
MessageBox("打开端口失败。");
}
2. GetCommState
功能:
主要用于获取串行口的当前配置。
函数原型:
BOOL GetCommState(
HANDLE hFile, // 文件句柄
LPDCB lpDCB // 指向设备控制块DCB
);
3. SetCommState
功能:
主要用于设置串行口的配置。
函数原型:
BOOL SetCommState(
HANDLE hFile, // 文件句柄
LPDCB lpDCB // 指向设备控制块DCB
);
用法举例:
HANDLE hCom;
hCom = CreateFile(…);
DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = 9600;
SetCommState(hCom, &dcb);
4. SetupComm
功能:
主要用于配置串口接收和发送缓冲区。
函数原型:
BOOL SetupComm(
HANDLE hFile, // 文件句柄
DWORD dwInQueue, // 接收缓冲区大小
DWORD dwOutQueue // 发送缓冲区大小
);
5. PurgeComm
功能:
主要用于清空串口接收和发送缓冲区。
函数原型:
BOOL PurgeComm(
HANDLE hFile, // 文件句柄
DWORD dwFlages // 执行的动作
);
说明:
dwFlages | PURGE_TXABORT | 中断所有写操作并立即返回,即使写操作还没有完成 |
PURGE_RXABORT | 中断所有读操作并立即返回,即使读操作还没有完成 | |
PURGE_TXCLEAR | 清空发送缓冲区 | |
PURGE_RXCLEAR | 清空接收缓冲区 |
6. GetCommTimeouts
功能:
读取TimeOut的值。
函数原型:
BOOL GetCommTimeouts(
HANDLE hFile, // 文件句柄
LPCOMMTIMEOUTS lpCommTimeouts // COMMTIMEOUTS结构指针
);
7. SetCommTimeouts
功能:
设置TimeOut的值。
函数原型:
BOOL SetCommTimeouts(
HANDLE hFile, // 文件句柄
LPCOMMTIMEOUTS lpCommTimeouts // COMMTIMEOUTS结构指针
);
COMMTIMEOUTS结构:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; // 读间隔超时
DWORD ReadTotalTimeoutMultiplier; // 读时间系数
DWORD ReadTotalTimeoutConstant; // 读时间常量
DWORD WriteTotalTimeoutMultiplier;// 写时间系数
DWORD WriteTotalTimeoutConstant; // 写时间常量
}COMMTIMEOUTS,*LPCOMMTIMEOUTS;
COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时 = 时间系数 × 要求读/写的字符数 + 时间常量
8. GetCommMask
功能:
得到设置的通信事件的掩码。
函数原型:
BOOL GetCommMask(
HANDLE hFile, // 文件句柄
LPDWORD lpEvtMask // 事件掩码
);
9. SetCommMask
功能:
设置想要得到的通信事件的掩码。
函数原型:
BOOL SetCommMask(
HANDLE hFile, // 文件句柄
DWORD dwEvtMask // 事件掩码
);
说明:
可设置的通信事件标志(即SetCommMask()函数所设置的掩码),可以有EV_BREAK、EV_CTS、EV_DSR、 EV_ERR、EV_RING、EV_RLSD、EV_RXCHAR、EV_RXFLAG、EV_TXEMPTY。
注:若对端口数据的响应时间要求较严格,可采用事件驱动I/O读写,Windows定义了9种串口通信事件,较常用的有:
EV_RXCHAR: 接收到一个字节,并放入输入缓冲区。
EV_TXEMPTY: 输出缓冲区中的最后一个字符发送出去。
EV_RXFLAG: 接收到事件字符(DCB结构中EvtChar成员),放入输入缓冲区。
10. WaitCommEvent
功能:
等待设定的通讯事件的发生,阻塞方式。
函数原型:
BOOL WaitCommEvent(
HANDLE hFile, // 文件句柄
LPDWORD lpEvtMask, // 事件掩码
LPOVERLAPPED lpOverlapped, //
);
11. ClearCommError
功能:
清除错误情况, 但是实际上它还可以拿来取得目前通讯设备的一些信息.。
函数原型:
BOOL ClearCommError(
HANDLE hFile, // 文件句柄
LPDWORD lpErrors, // 接收时的错误码
LPCOMSTAT lpStat // 通信状态
);
12. ReadFile
功能:
读取串口数据。
函数原型:
BOOL ReadFile(
HANDLE hFile, // 文件句柄
LPVOID lpBuffer, // 读缓冲区
DWORD nNumberOfBytesToRead, // 要求读入的字节数
LPDWORD lpNumberOfBytesRead, // 实际读入的字节数
LPOVERLAPPED lpOverlapped // 指向一个OVERLAPPED结构
); //若返回TRUE则表明操作成功
13. WriteFile
功能:
向串口发送数据。
函数原型:
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 写缓冲区
DWORD nNumberOfBytesToWrite, // 要求写入的字节数
LPDWORD lpNumberOfBytesWritten,// 实际写入的字节数
LPOVERLAPPED lpOverlapped // 指向一个OVERLAPPED结构
);
14. CloseHandle
功能:
关闭串口。
函数原型:
BOOL CloseHandle(
HANDLE hObject // 文件句柄
)