利用VB实现PC机与多单片机通讯_单片机论文
关键词:通讯 属性 事件
前言
在采用以pc机为控制中心的数据采集自动化控制系统中,通常需要单片机采集数据,然后用异步串行通讯方式传给pc机,pc对单片机进行定时控制,需要多个单片机协同工作。如果系统不很复杂,可通过定时器控件控制收发过程,在必要的地方自动接收装置,使定时控制和通讯过程完美地结合起来。这样,可以免去“握手”协议的繁琐过程,简化编程,提高速度。vb具有面向对象的设计方法,友好的用户界面,简单方便的串行通讯和实用性强等优点,无论借用其他语言就可以开发出优秀的控制系统通讯软件。本文介绍在windows 98环境下如何利用vb来实现pc机与多个ps1016单片机之间的串行通讯。
vb环境下通讯程序的设计
vb提供了串行端口控制mscomm来为应用程序提供串行通讯。该控件屏蔽了通信过程中的底层操作,程序员可以设置、监视mscomm控件的属性和事件,结合timer控件即可完成对串行口的初始化和数据的输入输出工作。mscomm控件的主要属性如下:
(1)commport 设置并返回通讯端口号。端口号可以设置为1~16的任何数,如mscomm.commport=2表示设置当前通讯端口为com2。
(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”。
(3)portopen 设置并返回通讯端口的状态,也可以打开和关闭端口。
(4)input 从接收缓冲区返回和删除字符。该属性在运行时为只读。
(5)inputlen 设置并返回每次input属性从接收缓冲区中读取的字符数。inputlen属性的缺省值为0。设置inputlen为0时,input将读取接收缓冲区的全部字符。
(6)output 向传送缓冲区写数据。要传送的数据可是文本数据或二进制数据。
(7)commevent 返回最近的通讯事件或错误。只要有通讯错误或事件发生错误时就会产生oncomm事件。commevent属性中存有该错误或事件的数值代码。
timer控件的主要属性如下:
(1)enabled 返回或设置一个值,该值用来确定一个窗体或控件否能够对用户产生的事件作出反应。通过把enabled设置为“galse”来使timer控件成为无效,将取消由控件的interval属性所建立的倒计时数。
(2)interval 返回或设置对timer控件的计时事件调用间的毫秒数。timer控件的enabled属性决定该控件是否对时间的推移作出响应。将enabled设置为“false”会关闭timer控件,设置为“true”则打开timer控件。当timer控件置为有效时,倒计时总是从其interval属性设置值开始。创建timer事件程序。可通知vb在每次interval到时该做什么。timer控件和enabled属性设置为“true”时,vb将在interval时间到后自动访问timer_timer过程。
为实现通讯程序,须在vb开发环境下设置一个用做控制通讯的窗体。窗体上主要有一个通讯控件mscomml和两个timer控件。vb的特点是事件驱动,定时器控件会定时触发相应事件的驱动程序。
1.发送单片机命令
为了使主机能够对整个检测过程进行实时控制,须要在发送命令以后设定等待的时间,也可以通过条件判断下一步是发达还是接收命令。对发送的命令,可能是文本方式或二进制代码。在发送二进制代码时,应特别注意发送的格式。
发送命令过程是一个带参过程,这样可使发送命令简便易行。具体程序如下:
sub发送单片机命令过程(command as byte)
dim输出命令(1 to 1)as byte
doevents
输出命令(1)=command
mscomm1.outbuffercount=0
mscomm1.output=输出命令
mscomm1.inbuffercount=0
end sub
2.接收数据
接收数据是一个被动的过程,可以通过函数来实现,由定时器开启。在接收过程中,多数用特征字符,如“ok”、“#”等。这些需要在通讯协议中约定。
function接收数据()
do
doevents
in_buffer $=in_buffer$&mscomm2.input
loop until instr(_buffer$,“ok”)'从串行端口读“ok”响应'
in_buffer=left(in_buffer,len(in_buffer)-2)
接收数据=in_buffer$
end function
3.timer控件控制
通过timer控件来控制通讯中的发送命令和接收数据过程,在通讯程序中设置两个timer控件分别控制发送单片机命令和接收单片机数据。为了实现一台pc机和多单片机之间的通讯,可在一个timer控件的过程中,在发送命令之前设定命令参数和要接收数据的单片机号,然后发送单片机命令;在另一个timer控件的过程中,根据发送前设定的单片机号,接收不同单片机的数据。
timer控件控制程序如下:
'发送命令主控程序
privata sub timersend_timer()
timersend.enabled=false
select case command
case 1]
call发送单片机命令过程(任务1)
timerreceive.enabled=false'启动自动接收
case2
call发送单片机命令过程(任务2)
mscomm1.rthreshold=0'关闭自动接收
timerreceive.interval=500
timerreceive.enabled=true'启动定时器接收机号=1
case 3
call发送单片机命令过程(任务3)
mscomm1.rthreshold=0'关闭自动接收
timerreceive.lnterval=500
timerreceive.enabled=true'启动定时器接收
机号=2
case 4
┆
case n
…
end select
end.sub
'接收数据主控程序
private sub timerreceive_timer()
timerreceive.enabled=false
select case机号
case 1
in_buffer$=接收数据(机号)
call任务2
case 2
in_buffer$=接收数据(机号)
call任务3
case 3
┆
case n
in_buffer$=接收数据(机号)
call任务n
end select
end sub
4.自动接收、监视总线状态和通讯错误的处理
自动接收、监视总线状态和通讯错误的处理可以通过oncomm事件实现。vb程序运行过程中只要设置mscomm1.rthreshold=1,在接收事件发生时程序就会自动访问mscomm1.oncomm()过程。
由于外界干扰或电压波动等原因,pc机和单片机之间的通讯可能会出现错误,如接收缓冲区溢出、网络端口超速等。这些可能发生的事件都能在代码中引起运行错误。为了处理这些错误,须要将错误处理代码添加到程序中。通过控件中的oncomm事件可以捕捉和处理错误。在通讯过程中所发生的通讯错误是commevent属性返回的。当commevent属性值发生改变时,表明有通讯错误,就会产生oncomm事件。同时,可以利用自动引发oncomm事件的特点在接收过程中加入状态显示码。这样可以监视通讯线路状态,得到单片机和主机及单片机和单片机之间的通讯进程。通讯错误的处理程序如下:
private sub mscomm1_oncomm()
select case mscomm1.commevent
case comreceive 'receive data '自动数据接收、监视总线通信
select case in_buffer $
call a
label.enabled=“正在执行任务1”
call b
…
end select
case comframe 'framing error '通讯错误处理
x=msgbox(“framing error!”,16)
…'错误处理
case comeventoverrun '数据丢失
x=msgbox(“数据丢失!”,16)
…'错误处理
end select
end sub