Windows串口编程的IOCTL和函数

举报
Rolle 发表于 2024/10/30 23:43:01 2024/10/30
【摘要】 在Windows系统中,串口编程是一项常见的任务,尤其是在需要与硬件设备进行通信的应用程序中。串口编程涉及到一系列的IOCTL(Input-Output Control)操作和函数调用,这些操作和函数提供了对串口进行配置、读写数据以及错误处理的能力。本文将详细介绍Windows串口编程中的IOCTL和相关函数,以及如何使用它们来实现串口通信。串口编程概述串口编程通常包括以下步骤:打开串口、配...

在Windows系统中,串口编程是一项常见的任务,尤其是在需要与硬件设备进行通信的应用程序中。串口编程涉及到一系列的IOCTL(Input-Output Control)操作和函数调用,这些操作和函数提供了对串口进行配置、读写数据以及错误处理的能力。本文将详细介绍Windows串口编程中的IOCTL和相关函数,以及如何使用它们来实现串口通信。

  1. 串口编程概述
    串口编程通常包括以下步骤:打开串口、配置串口、读写串口数据以及关闭串口。在Windows中,串口被视为一种特殊的文件,因此可以使用文件I/O函数来进行操作。此外,Windows还提供了专门的API函数来控制串口。

  2. 打开串口
    打开串口是串口编程的第一步。在Windows中,可以使用CreateFile函数来打开串口。这个函数的原型如下:
    HANDLE CreateFile(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    );
    在调用CreateFile时,lpFileName参数通常设置为串口的名称,如L"COM1"。dwDesiredAccess参数指定了对串口的访问类型,通常为GENERIC_READ | GENERIC_WRITE。dwShareMode参数通常设置为0,表示独占访问。dwCreationDisposition参数通常设置为OPEN_EXISTING,表示打开现有的串口。dwFlagsAndAttributes参数可以设置为FILE_ATTRIBUTE_NORMAL,表示串口是同步的;如果设置为FILE_FLAG_OVERLAPPED,则表示串口是异步的。

  3. 配置串口
    配置串口涉及到设置波特率、数据位、停止位、奇偶校验等参数。这些参数可以通过GetCommState和SetCommState函数来获取和设置。GetCommState函数的原型如下:
    BOOL GetCommState(
    HANDLE hFile,
    LPDCB lpDCB
    );
    SetCommState函数的原型如下:
    BOOL SetCommState(
    HANDLE hFile,
    LPDCB lpDCB
    );
    在调用这些函数之前,需要填充一个DCB结构体,该结构体包含了串口的配置参数。例如,可以设置波特率为9600,数据位为8位,停止位为1位,无奇偶校验:
    DCB dcb;
    dcb.DCBlength = sizeof(dcb);
    GetCommState(hComm, &dcb);
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = NOPARITY;
    SetCommState(hComm, &dcb);

  4. 读写串口
    读写串口可以使用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
);
在同步模式下,ReadFile和WriteFile函数会阻塞调用线程,直到指定的字节数被读取或写入。在异步模式下,这些函数会立即返回,实际的读写操作会在后台进行。

  1. IOCTL操作
    IOCTL操作是Windows提供的一种机制,用于对设备进行更细致的控制。在串口编程中,常用的IOCTL操作包括:

IOCTL_SERIAL_GET_DTRRTS:获取串口的DTR和RTS状态。
IOCTL_SERIAL_SET_DTR:设置串口的DTR信号。
IOCTL_SERIAL_CLR_DTR:清除串口的DTR信号。
IOCTL_SERIAL_SET_RTS:设置串口的RTS信号。
IOCTL_SERIAL_CLR_RTS:清除串口的RTS信号。
IOCTL_SERIAL_GET_CONFIG:获取串口的配置。
IOCTL_SERIAL_SET_CONFIG:设置串口的配置。
IOCTL_SERIAL_SET_BREAK_ON:在串口上发送BREAK信号。
IOCTL_SERIAL_SET_BREAK_OFF:停止发送BREAK信号。
IOCTL_SERIAL_SET_WAIT_MASK:设置等待面具。
IOCTL_SERIAL_WAIT_ON_MASK:等待指定的事件。
IOCTL_SERIAL_SET_CHAR:设置特定的字符。
IOCTL_SERIAL_GET_CHAR:获取特定的字符。
IOCTL_SERIAL_SET_TIMEOUTS:设置超时参数。
IOCTL_SERIAL_GET_TIMEOUTS:获取超时参数。
IOCTL_SERIAL_GET_PROPERTIES:获取串口的属性。
IOCTL_SERIAL_GET_MODEMSTATUS:获取调制解调器的状态。
IOCTL_SERIAL_GET_COMMSTATUS:获取通信状态。
IOCTL_SERIAL_XOFF_COUNTER:获取XOFF计数器的值。
IOCTL_SERIAL_LSRMST_INSERT:在数据流中插入LSR/MST信号。
IOCTL_SERIAL_LSRMST_ESCAPE:使用EscapeCommFunction函数处理LSR/MST信号。
这些IOCTL操作可以通过DeviceIoControl函数来执行,该函数的原型如下:
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
在调用DeviceIoControl时,dwIoControlCode参数指定了要执行的IOCTL操作,lpInBuffer和lpOutBuffer参数指向输入和输出数据缓冲区,nInBufferSize和nOutBufferSize参数指定了这些缓冲区的大小。

  1. 异步I/O操作
    在进行异步I/O操作时,可以使用GetOverlappedResult函数来获取操作的结果。这个函数的原型如下:
    BOOL GetOverlappedResult(
    HANDLE hFile,
    LPOVERLAPPED lpOverlapped,
    LPDWORD lpNumberOfBytesTransferred,
    BOOL bWait
    );
    如果bWait参数为TRUE,则GetOverlappedResult函数会等待操作完成。如果bWait为FALSE,则函数会立即返回,如果操作尚未完成,则返回FALSE,并且GetLastError函数返回ERROR_IO_INCOMPLETE。

  2. 超时设置
    串口操作的超时可以通过GetCommTimeouts和SetCommTimeouts函数来获取和设置。这两个函数的原型如下:
    BOOL GetCommTimeouts(
    HANDLE hFile,
    LPCOMMTIMEOUTS lpCommTimeouts
    );

BOOL SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTs lpCommTimeouts
);
在调用这些函数之前,需要填充一个COMMTIMEOUTS结构体,该结构体包含了超时参数。

  1. 通信状态和错误处理
    可以使用ClearCommError函数来清除串口的错误状态,并获取最近的误差信息。这个函数的原型如下:
    BOOL ClearCommError(
    HANDLE hFile,
    LPDWORD lpErrors,
    LPCOMSTAT lpStat
    );
    lpErrors参数指向一个变量,该变量接收误差代码,lpStat参数指向一个COMSTAT结构体,该结构体接收通信状态。

  2. 通信事件
    可以使用SetCommMask和WaitCommEvent函数来设置和等待通信事件。SetCommMask函数的原型如下:
    BOOL SetCommMask(
    HANDLE hFile,
    DWORD dwEvtMask
    );
    dwEvtMask参数指定了要监视的事件类型。WaitCommEvent函数的原型如下:
    BOOL WaitCommEvent(
    HANDLE hFile,
    LPDWORD lpEvtMask,
    LPOVERLAPPED lpOverlapped
    );
    在调用WaitCommEvent时,如果操作完成,函数会返回TRUE,并通过lpEvtMask参数返回发生的事件类型。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。