在多媒体语音教学系统中,主计算机与各学生机之间需要进行双向指令传送。由于串行通信具有高效、可靠、价格便宜等优点,故本系统采用了串行通信的方法。 Windows95是非实时操作系统,对此本系统设计了以单片机为核心的智能接口单元,负责完成与64台从机的实时通信。整个通信系统由一台PC机和一台负责通信及相关分组配对功能的智能接口单元和64台以单片机为核心的学生单元组成。本系统的单片机采用89C51。智能接口单元通过串行接口芯片8251 及电平转换器MAX202与主机通信,通过单片机自带串口用RS-485接口芯片MAX487与从单片机之间进行通信。智能接口单元与6台从单片机之间为总线式网络结构,采用RS-485接口标准。这是半双工的串行通信接口标准,由于采用平衡驱动差分接收电路,具有抗干扰能力强的特点,适用于远距离、高速率下的多机通信。拓扑结构示意图如图1所示。硬件接口示意图见图2。
1 通信协议的约定
在通信过程中,PC机将指令打包后发给智能接口单元(以下简称主单片机)。主单片机收到完整一包后将包解开,按对每个从机的指令分别发送,同时将各从机发给PC机的指令送给PC 机。由于64个从机和主单片机使用同一串口通信线,为避免发生冲突,主单片机处于主动状态,按一定的定时间隔与每一台从机顺序通信。主单片机在与每一台从机通信过程中先发送地址,从机收到地址后若与自己的地址一致,则继续接收主单片机发来的一个字节的命令码,从机收到命令后,将自己的一个字节的命令发送到主单片机。主单片机完成与64个从机的通信需要64个定时间隔,只要定时间隔足够短,主单片机与从机基本上可以实现实时通信。在整个通信过程中,主单片机起着通信枢纽的作用。
2 Windows95下实现串行通信的方法
Visual Basic 6.0提供了功能强大的MSCOMM.VBX通信控件,它提供了通过串口发送和接收数据的通信能力,不但包括了全部WindowsAPI中关于串行通信的 16个函数所完成的功能,而且开拓了更多的方便用户设计的对象属性来满足不同用户不同业务的需求。该通信控件可以采用事件驱动和查询方式来处理和解决通信软件的开发和设计。其中事件驱动是较常用的方式。该控件使用OnComm事件来实现对通信中出现的相关事件以及检测和处理通信错误等方面的问题的处理。例如,根据RThreshold 属性设置值,当接收缓冲区内接收到相应字节的字符时,引发OnComm事件,在事件处理程序中接收数据。
Private Sub Form—Load() '完成对串口控件的初始化
MSComm1.CommPort = 1 '选用COM1串行口
MSComm1.Settings= "9600,N,8,1"'9600波特率,无奇偶校验,8位数据,一位停止位。
MSComm1.InputLen= 0 '当输入占用时,告诉控件读入整个缓冲区。
MSComm1.InBufferSize=1024 '设置接收缓冲的字节长度
MSComm1.InBufferCount=0 '清除接收缓冲区数据
MSComm1.OutBufferCount=0 '清除发送缓冲区数据
MSComm1.RThreshold= 3 '接收缓冲区接收到3个字符后引发OnComm事件。
MSComm1.InputMode= comInputModeBinary '接收二进制格式的数据
MSComm1.PortOpen= True '打开端口。
End Sub
Private Sub MSComm1—OnComm() '处理OnComm事件
Dim Buf As Variant
Dim Data() As Byte
Select Case MSComm1.CommEvent
Case comEventRxOver '接收缓冲区溢出。
MsgBox "接收缓冲区溢出"
Case comEventTxFull '传输缓冲区已满。
MsgBox "传输缓冲区已满"
Case comEvReceive ' 收到 RThreshold # of Data
Buf = MSComm1.Input
Data = Buf
'
'在这里可加入对接收数据的处理
'
End Select
End Sub
发送程序较为简单,可对Output属性赋值完成。
Private Sub Command1—Click() '处理发送命令
Dim Buf As Variant
Dim Data(66) As Byte '定义发送数据的字节数组
'
'将需发送的数据赋给Data数组
'
Buf = Data
MSComm1.Output = Buf
End Sub[page]
VB可以发送文本数据和二进制数据。发送二进制数据时,必须传递一个包含字节数组的 Variant到 Output 属性。接收二进制数据时,Input属性通过一个Variant返回一二进制数据的数组。为便于命令的表达,本系统采用二进制格式的数据。
为更深入了解该控件,这里对接收数据缓冲区进行了分析,该控件开辟的接收数据缓冲区类似一个队列,Windows95低层驱动程序负责将接收到的数据填入队列尾部,同时修改尾指针,当OnComm事件发生后用Input读取InputLen长度个字节后,将队列头指针后移InputLen位。可以把这个缓冲区开得大一点,这样即使暂时来不及处理也不会丢失数据。接收数据缓冲区数据结构示意图如图3所示。
3 RS-485多机通信的实现
89C51单片机的串行口工作方式3可实现多机通信。接收时,若SM2=1,表示置多机通信功能位,这时出现两种可能情况:接收到第9位数据为1时,数据才装入SBUF,并置RI=1向CPU发出中断请求;如果接收到第9位数据为0,则不产生中断标志,信息将抛弃。若SM2=0,则接收到的第9位数据不论是0还是1都产生RI=1中断标志,接收到的数据装入SBUF中。根据这个功能,可实现多个 89C51应用系统的串行通信。
机定时中断服务程序框图
多机通信过程安排如下:使所有从机的SM2位置1,处于只接收地址帧的状态;主机发送一帧地址信息,其中包含8位地址,第9位为地址、数据标志位,第9位置1表示发送的是地址;从机接收到地址帧后 ,各自将所接收的地址与本从机的地址相比较,对于地址相符的从机,使SM2清0以接收主机随后发来的信息,对于地址不相符的从机,仍保持SM2=1状态,对主机随后发送的数据不予理睬,直至发送新的地址帧;主机发送控制指令与数据,给被寻址的从机数据帧的第9位置0,表示发送的是数据。
单片机程序采用PLM51语言设计,主单片机定时中断服务程序框图如图4所示。主单片机RS-485串行口接收和发送中段服务程序框图如图5所示。主单片机RS-232C串行口接收中断服务程序如图6所示。从单片机RS-485串行口接收和发送中段服务程序框图如图7所示。主单片机在主程序中以查询方式将各从机送来的数据从内存中读出后顺序发送给上位PC机。程序清单略。
从实际使用来看,本系统具有较高的性价比,且稳定可靠,稍加改进即可用于自动化测量和实时控制系统的数据通信。
参考文献
1 何立民.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航天航空大学出版社,1990.1
2 陈功富,韩贤东.计算机网设计与实现.北京:人民邮电出版社,1994.10
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』