摘要:在Windows98下利用VB的串行通讯控件可实现PC机与多单片机之间的通讯。采用定时器控制大大加快了自动化进程,克服了往多“握手”协议造成的通讯速度缓慢的缺点。本文以PS1016单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收。
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) 前言 WWW_PLCJS@_COM%-PLC-技.术_网 在采用以PC机为控制中心的数据采集自动化控制系统中,通常需要单片机采集数据,然后用异步串行通讯方式传给PC机,PC对单片机进行定时控制,需要多个单片机协同工作。如果系统不很复杂,可通过定时器控件控制收发过程,在必要的地方自动接收装置,使定时控制和通讯过程完美地结合起来。这样,可以免去“握手”协议的繁琐过程,简化编程,提高速度。VB具有面向对象的设计方法,友好的用户界面,简单方便的串行通讯和实用性强等优点,无论借用其他语言就可以开发出优秀的控制系统通讯软件。本文介绍在Windows 98环境下如何利用VB来实现PC机与多个PS1016单片机之间的串行通讯。 WWW_PLC※JS_COM-PmLC-技.术_网 VB环境下通讯程序的设计 WWW_PLCJS_COM-PLC-技.术_网 VB提供了串行端口控制Mscomm来为应用程序提供串行通讯。该控件屏蔽了通信过程中的底层操作,程序员可以设置、监视Mscomm控件的属性和事件,结合Timer控件即可完成对串行口的初始化和数据的输入输出工作。Mscomm控件的主要属性如下: WWW_PLCJS@_COM%-PLC-技.术_网 (1)Commport 设置并返回通讯端口号。端口号可以设置为1~16的任何数,如Mscomm.Commport=2表示设置当前通讯端口为COM2。 WWW_PLC※JS_COM-PmLC-技.术_网 (2)Setting 设置并返回波特率、奇偶校验、数据位、停止位。格式为Mscomm.Setting=String。String是一个包含四部分的字符串:第一部分为波特率;第二部分为奇偶校验,N表示不校验,M表示符号校验,E表示偶校验,O表示奇校验,S表示空格校验;第三部分为数据位数,其可选值为4,5,6,7,8;第四部分为停止位位数,其可选值为1,1.5,2。Setting属性的缺省值为“9600,N,8,1”。 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) (3)Portopen 设置并返回通讯端口的状态,也可以打开和关闭端口。 WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户) (4)Input 从接收缓冲区返回和删除字符。该属性在运行时为只读。 W1WW_P4LCJS_COM-PLC-技.术_网 (5)InputLen 设置并返回每次Input属性从接收缓冲区中读取的字符数。InputLen属性的缺省值为0。设置InputLen为0时,Input将读取接收缓冲区的全部字符。 W1WW_P4LCJS_COM-PLC-技.术_网 (6)Output 向传送缓冲区写数据。要传送的数据可是文本数据或二进制数据。 WW.W_PLCJS_COM-PLC-技.术_网 (7)CommEvent 返回最近的通讯事件或错误。只要有通讯错误或事件发生错误时就会产生Oncomm事件。CommEvent属性中存有该错误或事件的数值代码。 P.L.C.技.术.网——可编程控制器技术门户 Timer控件的主要属性如下: W1WW_P4LCJS_COM-PLC-技.术_网 (1)Enabled 返回或设置一个值,该值用来确定一个窗体或控件否能够对用户产生的事件作出反应。通过把Enabled设置为“Galse”来使Timer控件成为无效,将取消由控件的Interval属性所建立的倒计时数。 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户) (2)Interval 返回或设置对Timer控件的计时事件调用间的毫秒数。Timer控件的Enabled属性决定该控件是否对时间的推移作出响应。将Enabled设置为“False”会关闭Timer控件,设置为“True”则打开Timer控件。当Timer控件置为有效时,倒计时总是从其Interval属性设置值开始。创建Timer事件程序。可通知VB在每次Interval到时该做什么。Timer控件和Enabled属性设置为“True”时,VB将在Interval时间到后自动访问Timer_Timer过程。 WWW.PLCJS.COM——可编程控制器技术门户 为实现通讯程序,须在VB开发环境下设置一个用做控制通讯的窗体。窗体上主要有一个通讯控件Mscomml和两个Timer控件。VB的特点是事件驱动,定时器控件会定时触发相应事件的驱动程序。 WWcW_PLCJS_COM-PLC-技.术_网 1.发送单片机命令 plcjs.技.术_网 为了使主机能够对整个检测过程进行实时控制,须要在发送命令以后设定等待的时间,也可以通过条件判断下一步是发达还是接收命令。对发送的命令,可能是文本方式或二进制代码。在发送二进制代码时,应特别注意发送的格式。 WWcW_PLCJS_COM-PLC-技.术_网 发送命令过程是一个带参过程,这样可使发送命令简便易行。具体程序如下: ——可——编——程——控-制-器-技——术——门——户 Sub发送单片机命令过程(command As Byte) WW.W_PLCJS_COM-PLC-技.术_网 Dim输出命令(1 To 1)As Byte WWW_PLCJS_COM-PLC-技.术_网 DoEvents W1WW_P4LCJS_COM-PLC-技.术_网 输出命令(1)=command WWcW_PLCJS_COM-PLC-技.术_网 MSComm1.OutBufferCount=0 WWW_PLC※JS_COM-PmLC-技.术_网 MSComm1.Output=输出命令 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户) MSComm1.InBufferCount=0 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) End Sub plcjs.技.术_网 2.接收数据 W1WW_P4LCJS_COM-PLC-技.术_网 接收数据是一个被动的过程,可以通过函数来实现,由定时器开启。在接收过程中,多数用特征字符,如“OK”、“#”等。这些需要在通讯协议中约定。 P.L.C.技.术.网——可编程控制器技术门户 Function接收数据() plcjs.技.术_网 Do P.L.C.技.术.网——可编程控制器技术门户 DoEvents WW.W_PLCJS_COM-PLC-技.术_网 In_buffer $=In_buffer$&MSComm2.Input WW.W_PLC※JS_C,OM-PL,C-技.术_网 Loop Until InStr(_buffer$,“OK”)’从串行端口读“OK”响应’ WWW_P※LCJS_COM-PLC-)技.术_网 In_buffer=Left(In_buffer,len(In_buffer)-2) P.L.C.技.术.网——可编程控制器技术门户 接收数据=In_buffer$ P.L.C.技.术.网——可编程控制器技术门户 End Function WWW.PLCJS.COM——可编程控制器技术门户 3.Timer控件控制 WWW_PL※CJS_COM-PLC-技.术_网 通过Timer控件来控制通讯中的发送命令和接收数据过程,在通讯程序中设置两个Timer控件分别控制发送单片机命令和接收单片机数据。为了实现一台PC机和多单片机之间的通讯,可在一个Timer控件的过程中,在发送命令之前设定命令参数和要接收数据的单片机号,然后发送单片机命令;在另一个Timer控件的过程中,根据发送前设定的单片机号,接收不同单片机的数据。 WW.W_PLC※JS_C,OM-PL,C-技.术_网 Timer控件控制程序如下: WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户) ’发送命令主控程序 ——可——编——程——控-制-器-技——术——门——户 Privata Sub TimerSend_Timer() W1WW_P4LCJS_COM-PLC-技.术_网 TimerSend.Enabled=False WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户) Select Case command WW.W_PLC※JS_C,OM-PL,C-技.术_网 Case 1] ——可——编——程——控-制-器-技——术——门——户 Call发送单片机命令过程(任务1) WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户) TimerReceive.Enabled=False’启动自动接收 WWW_P※LCJS_COM-PLC-)技.术_网 Case2 WWW_PLCJS_COM-PLC-技.术_网 Call发送单片机命令过程(任务2) WWW_PLCJS_COM-PLC-技.术_网 MSComm1.Rthreshold=0’关闭自动接收 WWW_PLCJS_COM-PLC-技.术_网 TimerReceive.Interval=500 WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户) TimerReceive.Enabled=True’启动定时器接收机号=1 WWW_PLCJS@_COM%-PLC-技.术_网 Case 3 WWW_PL※CJS_COM-PLC-技.术_网 Call发送单片机命令过程(任务3) WWW_PLCJS@_COM%-PLC-技.术_网 MSComm1.Rthreshold=0’关闭自动接收 plcjs.技.术_网 TimerReceive.lnterval=500 WWW_PLC※JS_COM-PmLC-技.术_网 TimerReceive.Enabled=True’启动定时器接收 WWW_PLC※JS_COM-PmLC-技.术_网 机号=2 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) Case 4 WWW_PLCJS_COM-PLC-技.术_网 ┆ WWW_P※LCJS_CO※M-PLC-技-.术_网 Case n WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) … plcjs.技.术_网 End Select WWW_PL※CJS_COM-PLC-技.术_网 End.Sub WW.W_PLCJS_COM-PLC-技.术_网 ’接收数据主控程序 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户) Private Sub TimerReceive_Timer() WWW_P※LCJS_COM-PLC-)技.术_网 TimerReceive.Enabled=False WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) Select Case机号 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户 Case 1 WWW_P※LCJS_COM-PLC-)技.术_网 In_buffer$=接收数据(机号) WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户) Call任务2 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户) Case 2 ——可——编——程——控-制-器-技——术——门——户 In_buffer$=接收数据(机号) WWW_PLCJS@_COM%-PLC-技.术_网 Call任务3 WWW_P※LCJS_CO※M-PLC-技-.术_网 Case 3 WWW_PLCJS@_COM%-PLC-技.术_网 ┆ WW.W_PLC※JS_C,OM-PL,C-技.术_网 Case n WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户) In_buffer$=接收数据(机号) WW.W_PLCJS_COM-PLC-技.术_网 Call任务n WW.W_PLCJS_COM-PLC-技.术_网 End Select WWW_P※LCJS_CO※M-PLC-技-.术_网 End Sub WWW_PL※CJS_COM-PLC-技.术_网 4.自动接收、监视总线状态和通讯错误的处理 WWW_PLCJS_COM-PLC-技.术_网 自动接收、监视总线状态和通讯错误的处理可以通过OnComm事件实现。VB程序运行过程中只要设置MSComm1.Rthreshold=1,在接收事件发生时程序就会自动访问MSComm1.OnComm()过程。 W1WW_P4LCJS_COM-PLC-技.术_网 由于外界干扰或电压波动等原因,PC机和单片机之间的通讯可能会出现错误,如接收缓冲区溢出、网络端口超速等。这些可能发生的事件都能在代码中引起运行错误。为了处理这些错误,须要将错误处理代码添加到程序中。通过控件中的OnComm事件可以捕捉和处理错误。在通讯过程中所发生的通讯错误是CommEvent属性返回的。当CommEvent属性值发生改变时,表明有通讯错误,就会产生OnComm事件。同时,可以利用自动引发OnComm事件的特点在接收过程中加入状态显示码。这样可以监视通讯线路状态,得到单片机和主机及单片机和单片机之间的通讯进程。通讯错误的处理程序如下: WWW_PLCJS@_COM%-PLC-技.术_网 Private Sub MSComm1_OnComm() P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户 Select Case MSComm1.CommEvent WWW_PLCJS@_COM%-PLC-技.术_网 Case ComReceive ’Receive data ’自动数据接收、监视总线通信信息 WWW_P※LCJS_CO※M-PLC-技-.术_网 Select Case In_buffer $ WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户) Call A P.L.C.技.术.网——可编程控制器技术门户 Label.Enabled=“正在执行任务1” WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户) Call B WWW_PL※CJS_COM-PLC-技.术_网 … WWW_P※LCJS_CO※M-PLC-技-.术_网 End Select WW.W_PLC※JS_C,OM-PL,C-技.术_网 Case comFrame ’Framing Error ’通讯错误处理 ——可——编——程——控-制-器-技——术——门——户 X=MsgBox(“Framing Error!”,16) P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户 …’错误处理 WW.W_PLC※JS_C,OM-PL,C-技.术_网 Case comEventOverrun ’数据丢失 WWW_P※LCJS_COM-PLC-)技.术_网 X=MsgBox(“数据丢失!”,16) WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户) …’错误处理 WW.W_PLC※JS_C,OM-PL,C-技.术_网 End Select plcjs.技.术_网 End Sub |