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
評論