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