在 Delphi 中用 API 函数实现串行通信设计(PC 机串口编程)
----基于 windows 的串行通信机制
----Windows 操作系统的机制禁止应用程序直接访问计算机硬件,但它为程序员提供了一系列的标准 API 函
数,使得应用程序的编制更加方便并且免除了对有关硬件的调试麻烦。在 Windows 中,原来 Windows3.X
的 WM_COMMNOTIFY 消息已被取消,操作系统为每个通信设备开辟了用户可定义大小的读/写缓冲区,数
据进出通信口均由操作系统后台完成,应用程序只需对读/写缓冲区操作即可。windows 中几个常用的串行
通信操作函数如下:
CreatFile 打开串行口
CloseHandle 关闭串行口
SetupComm 设置通信缓冲区的大小
ReadFile 读串口操作
WriteFile 写串口操作
SetCommState 设置通信参数
GetCommState 获取默认通信参数
ClearCommError 清除串口错误并获取当前状态
----除上述几个函数外,还要经常用到一个重要的记录 DCB(设备控制块)。DCB 中记录有可定义的串行口
参数,设置串行口参数时必须先用 GetCommState 函数将系统默认值填入 DCB 控制块,然后才可把用户想
改变的自定义值设定。
----在 windows 中进行串行通信除了解基本的通信操作函数外,还要掌握多线程编程。线程是进程内部执行
的路径,是操作系统分配 CPU 时间的基本实体。每个进程都由单线程开始完成应用程序的执行。串行通信
需要利用多线程技术实现,其主要的处理逻辑可以表述如下:进程一开始先由主线程做一些必要的初始化
工作,然后主线程根据需要在适当时候建立通信监视线程监视通信口,当指定的串行口事件发生时,向主
线程发送 WM_COMMNOTIFY 消息(由于 WIN95 取消了 WM_COMMNOTIFY 消息,因此必须自己创建),主线
程对其进行处理。若不需要 WM_COMMNOTIFY 消息,则主线程终止通信监视线程。
----多线程同时执行,将会引起对共享资源的冲突。为避免冲突,就要用同步多线程对共享资源进行访问。
WINDOWS 提供了许多保持线程同步的方法,笔者采用创建事件对象来保持线程同步。通过 CraeteEvent
()创建事件对象,使用 SetEvent()或 PulseEvent()函数将事件对象设置成信号同步。在应用程序中,
利用 WaitSingleObject()函数等待同步的触发,等到指定的事件被其它线程设置为有信号时,才继续向下
执行程序。
----Delphi 下的具体实现方法
----Delphi 的强大功能和支持多线程的面向对象编程技术,使得实现串行通信非常简单方便。它通过调用外
部的 API 函数来实现,主要步骤如下:首先,利用 CreateFile 函数打开串行口,以确定本应用程序对此串行
口的占有权,并封锁其它应用程序对此串口的操作;其次,通过 GetCommState 函数填充设备控制块 DCB,
再通过调用 SetCommState 函数配置串行口的波特率、数据位、校验位和停止位。然后,创建串行口监视
线程监视串行口事件。在此基础上就可以在相应的串口上操作数据的传输;最后,用 CloseHandle 函数关
闭串行口。具体的程序如下,本程序用 Delphi3.0 编制在 Win95 环 t 境下调试通过,已投入实际应用中,供
广大读者参考。