:1001—9944(2001)04—0058—03Ξ用Delphi开发二进制方式的多线程串行通讯程序(1.南京航空航天大学自动化学院,南京210016;2.盐城工学院电气工程系,江苏盐城224003)摘要:本文介绍了在Delphi环境下如何采用控件方法实现上位机与单片机之间的二进制方式的多线程串行通讯。文中给出了一个编程示例,具体说明了这种软件的使用方法。关键词:串行通讯;多线程;Windows;Delphi:TP311.1文献标识码:B1引言某型大坝自动监测系统的研制要求主机能对多至255个测控模块进行管理并能对每个测控模块进行程序的远程升级,即测控模块中的程序运行代码可以通过网络下载。对此,我们研制了一套基于RS2485串行总线的测控网络,测控模块采用基于AT89C51的单片机系统,并采用Delphi5.0编制了上位机通讯软件。由于上位机与单片机的之间的通讯涉及到控制字符和单片机二进制程序代码的传输,而控制字符与程序代码有可能是ASCII值大于80H的字符,因此常用的基于文本的传输方式已经不适用,必须编写二进制方式的串行通讯程序。同时,为了提高效率,使在程序下载时能动态地显示下载进度,在软件中引入Delphi的多线程工作模型。用Delphi编制基于Windows平台下的串行通信程序一般有两种方法:一种方法是通过调用Windows的应用程序接口API函数的方法来实现;另一种方法是使用现成的串行通信控件的方法。API函数方法,使用复杂繁琐,但灵活,功能强;控件方法编程简单,可靠,用户无须深入串行口的编程,只需设置几个参数就可以按查询或中断方式实现串行通讯,使通讯编程大为简化,对于一般的应用,用控件的方法就足够了。本文介绍如何用Delphi并使用MSCOMM32.OCX控件编制二进制方式的多线程串行通讯程序。MSCOMM32.OCX控件是微软公司在VB和VC开发软件中随带的串行通信控件,该控件屏蔽了通信过程中的底层操作。程序员应用时只需设置和监视该控件的属性和事件即可完成对串行口的初始化和数据的输入和输出工作,当在Delphi5.0中安装该控件后,Delphi自动将它重定义为TMSComm类。它的一些重要属Commport:Settings:设置并返回通讯端口号以字符串的形式设置并返回波特率、奇偶校验、数据位和停止位Input:从接收缓冲区返回和删除字符Output:PortOpen:向传输缓冲区写一个字符串设置并返回通讯端口的状态有关该控件的详细说明,可从相应的帮助文档中得到,在此不再赘述。3二进制方式通讯编程有关上位机与单片机通讯编程的文章不少,但大都局限于以文本方式发送与接收数据。这样的通讯方式虽然可以满足特定需要,但是缺乏通用性,当待传输数据包含非文本字符,如控制字符、Null及一些包含ASCII码大于80H的字符时,则必须进行二进制方式的串行通讯编程在TMSComm类中有一项InputMode属性,当设置InputMode=0时,数据是以文本方式取回即从数据缓冲区取回的是字符串;当InputMode=1时,数据是以二进制方式取回,即取回的是二进制字节数组。而发送二进制数据则需要依照TM22串行通信控件简介收稿日期:2001201215(磁盘稿)ΞSComm类的规则通过动态数组和变体(Variant)的方法实现。TMSComm类规定它的Output属性可以传输文本数据或二进制数据。当发送二进制数据时,必须传递一个包含字节数组的变体到Output属性。因此在发送二进制数时,必须定义一个字节类型的动态数组和一个变体,将待发送的二进制数放入动态数组,再将该动态数组赋给接调用WindowsAPI的CreateThread函数或直接采用DelphiRTL库的System单元中已封好了的标准例程BeginThread来创建一个线程。但最方便的方法是采用Delphi的VCL库中TThread对象。Delphi中的可视化组件库VCL对象不是线程安全的,即Delphi不支持多个线程同时访问它的VCL库。但是在Delphi中专门创建了一个Tthread对象以解决这个问题。这个TThread对象封装了WindowsAPI和System单元中有关线程运用的多个函数和例程,利用操作系统分时段控制各个线程的“休眠”与“唤醒”以达到线程工作的同步。当被“唤醒”后就调用TThread对象的Synchronize过程通知主4多线程机制的引入多线程是指CPU可以分时处理多个任务,而每个任务都像独占处理器一样。当然,只有一个CPU的计算机不可能真正地“同时”执行多个线程,而是操作系统把时间分成若干个时间片,然后把一个个时间片分...