PC机与单片机多机实时通信的设计与实现
在多媒体语音教学系统中,主计算机与各学生机之间需要进行双向指令传送。由于串行通信具有高效、可靠、价格便宜等优点,故本系统采用了串行通信的方法。 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
VB可以发送文本数据和二进制数据。发送二进制数据时,必须传递一个包含字节数组的 Variant到 Output 属性。接收二进制数据时,Input属性通过一个Variant返回一二进制数据的数组。为便于命令的表达,本系统采用二进制格式的数据。
为更深入了解该控件,这里对接收数据缓冲区进行了分析,该控件开辟的接收数据缓冲区类似一个队列,Windows95低层驱动程序负责将接收到的数据填入队列尾部,同时修改尾指针,当OnComm事件发生后用Input读取InputLen长度个字节后,将队列头指针后移InputLen位。可以把这个缓冲区开得
Visual Basic 串行通信控件 RS-485 RS-232C 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)