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