串行通信与重叠I/O Win 32 系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用 API 函数 CreateFile 来打开或创建的。该函数的声明为: HANDLE CreateFile( LPCTSTR lpFileName, // 文件名 DWORD dwDesiredAccess, // 访问模式 DWORD dwShareMode, // 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 通常为 NULL DWORD dwCreationDistribution, // 创建方式 DWORD dwFlagsAndAttributes, // 文件属性和标志 HANDLE hTemplateFile // 临时文件的句柄,通常为 NULL ); 如 果 调 用 成 功 , 那 么 该 函 数 返 回 文件的句 柄 , 如 果 调 用 失 败 , 则 函 数 返 回INVALID_HANDLE_VALUE。 在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个 DCB 结构来进行。DCB 结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置置串行口的属性时,都要用 DCB 结构来作为缓冲区。 调用 GetCommState 函数可以获得串口的配置,该函数把当前配置填充到一个 DCB 结构中。一般在用 CreateFile 打开串行口后,可以调用 GetCommState 函数来获取串行口的初始配置。要修改串行口的配置,应该先修改 DCB 结构,然后再调用 SetCommState 函数用指定的DCB 结构来设置串行口。 除了在 DCB 中的设置外,程序一般还需要设置 I/O 缓冲区的大小和超时。Windows 用I/O 缓冲区来暂存串行口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。调用 SetupComm 函数可以设置串行口的输入和输出缓冲区的大小。 在用 ReadFile 和 WriteFile 读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么 ReadFile 或 WriteFile 的操作就会结束。要查询当前的超时设置应调用 GetCommTimeouts 函数,该函数会填充一个 COMMTIMEOUTS 结构。调用 SetCommTimeouts 可以用某一个 COMMTIMEOUTS 结构的内容来设置超时。 有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用 COMMTIMEOUTS 结构可以规定读/写操作的超时,该结构的定义为: typedef struct _COMMTIMEOUTS { DWORD Read...