PC機與單片機多機實(shí)時(shí)通信的設計與實(shí)現
在多媒體語(yǔ)音教學(xué)系統中,主計算機與各學(xué)生機之間需要進(jìn)行雙向指令傳送。由于串行通信具有高效、可靠、價(jià)格便宜等優(yōu)點(diǎn),故本系統采用了串行通信的方法。 Windows95是非實(shí)時(shí)操作系統,對此本系統設計了以單片機為核心的智能接口單元,負責完成與64臺從機的實(shí)時(shí)通信。整個(gè)通信系統由一臺PC機和一臺負責通信及相關(guān)分組配對功能的智能接口單元和64臺以單片機為核心的學(xué)生單元組成。本系統的單片機采用89C51。智能接口單元通過(guò)串行接口芯片8251 及電平轉換器MAX202與主機通信,通過(guò)單片機自帶串口用RS-485接口芯片MAX487與從單片機之間進(jìn)行通信。智能接口單元與6臺從單片機之間為總線(xiàn)式網(wǎng)絡(luò )結構,采用RS-485接口標準。這是半雙工的串行通信接口標準,由于采用平衡驅動(dòng)差分接收電路,具有抗干擾能力強的特點(diǎn),適用于遠距離、高速率下的多機通信。拓撲結構示意圖如圖1所示。硬件接口示意圖見(jiàn)圖2。
1 通信協(xié)議的約定
在通信過(guò)程中,PC機將指令打包后發(fā)給智能接口單元(以下簡(jiǎn)稱(chēng)主單片機)。主單片機收到完整一包后將包解開(kāi),按對每個(gè)從機的指令分別發(fā)送,同時(shí)將各從機發(fā)給PC機的指令送給PC 機。由于64個(gè)從機和主單片機使用同一串口通信線(xiàn),為避免發(fā)生沖突,主單片機處于主動(dòng)狀態(tài),按一定的定時(shí)間隔與每一臺從機順序通信。主單片機在與每一臺從機通信過(guò)程中先發(fā)送地址,從機收到地址后若與自己的地址一致,則繼續接收主單片機發(fā)來(lái)的一個(gè)字節的命令碼,從機收到命令后,將自己的一個(gè)字節的命令發(fā)送到主單片機。主單片機完成與64個(gè)從機的通信需要64個(gè)定時(shí)間隔,只要定時(shí)間隔足夠短,主單片機與從機基本上可以實(shí)現實(shí)時(shí)通信。在整個(gè)通信過(guò)程中,主單片機起著(zhù)通信樞紐的作用。
2 Windows95下實(shí)現串行通信的方法
Visual Basic 6.0提供了功能強大的MSCOMM.VBX通信控件,它提供了通過(guò)串口發(fā)送和接收數據的通信能力,不但包括了全部WindowsAPI中關(guān)于串行通信的 16個(gè)函數所完成的功能,而且開(kāi)拓了更多的方便用戶(hù)設計的對象屬性來(lái)滿(mǎn)足不同用戶(hù)不同業(yè)務(wù)的需求。該通信控件可以采用事件驅動(dòng)和查詢(xún)方式來(lái)處理和解決通信軟件的開(kāi)發(fā)和設計。其中事件驅動(dòng)是較常用的方式。該控件使用OnComm事件來(lái)實(shí)現對通信中出現的相關(guān)事件以及檢測和處理通信錯誤等方面的問(wèn)題的處理。例如,根據RThreshold 屬性設置值,當接收緩沖區內接收到相應字節的字符時(shí),引發(fā)OnComm事件,在事件處理程序中接收數據。
Private Sub Form—Load() '完成對串口控件的初始化
MSComm1.CommPort = 1 '選用COM1串行口
MSComm1.Settings= "9600,N,8,1"'9600波特率,無(wú)奇偶校驗,8位數據,一位停止位。
MSComm1.InputLen= 0 '當輸入占用時(shí),告訴控件讀入整個(gè)緩沖區。
MSComm1.InBufferSize=1024 '設置接收緩沖的字節長(cháng)度
MSComm1.InBufferCount=0 '清除接收緩沖區數據
MSComm1.OutBufferCount=0 '清除發(fā)送緩沖區數據
MSComm1.RThreshold= 3 '接收緩沖區接收到3個(gè)字符后引發(fā)OnComm事件。
MSComm1.InputMode= comInputModeBinary '接收二進(jìn)制格式的數據
MSComm1.PortOpen= True '打開(kāi)端口。
End Sub
Private Sub MSComm1—OnComm() '處理OnComm事件
Dim Buf As Variant
Dim Data() As Byte
Select Case MSComm1.CommEvent
Case comEventRxOver '接收緩沖區溢出。
MsgBox "接收緩沖區溢出"
Case comEventTxFull '傳輸緩沖區已滿(mǎn)。
MsgBox "傳輸緩沖區已滿(mǎn)"
Case comEvReceive ' 收到 RThreshold # of Data
Buf = MSComm1.Input
Data = Buf
'
'在這里可加入對接收數據的處理
'
End Select
End Sub
發(fā)送程序較為簡(jiǎn)單,可對Output屬性賦值完成。
Private Sub Command1—Click() '處理發(fā)送命令
Dim Buf As Variant
Dim Data(66) As Byte '定義發(fā)送數據的字節數組
'
'將需發(fā)送的數據賦給Data數組
'
Buf = Data
MSComm1.Output = Buf
End Sub
評論