本發(fā)明涉及實(shí)時(shí)嵌入式通信技術(shù)領(lǐng)域,特別是一種串口通信方法。
背景技術(shù):
串口通信具有傳輸距離遠(yuǎn)、傳輸穩(wěn)定、簡(jiǎn)單實(shí)用等特點(diǎn),已被廣泛應(yīng)用于工業(yè)控制、數(shù)據(jù)采集、網(wǎng)絡(luò)通信等領(lǐng)域。在這些應(yīng)用領(lǐng)域中,有的系統(tǒng)往往需要實(shí)現(xiàn)多路串口通信來實(shí)現(xiàn)不同的控制和信息采集等不同的需求,例如將某一路串口用于采集數(shù)據(jù),而另外一路串口用于發(fā)送控制命令等。另外,在基于串口的通信設(shè)備研發(fā)過程中,經(jīng)常需要監(jiān)視通信雙方的數(shù)據(jù)收發(fā)交互情況,特別是在軍用控制系統(tǒng)中,對(duì)于數(shù)據(jù)收發(fā)的準(zhǔn)確性和實(shí)時(shí)性有著嚴(yán)格的要求,因此對(duì)于嵌入式實(shí)時(shí)系統(tǒng)還需要知道通信雙方收發(fā)數(shù)據(jù)的準(zhǔn)確時(shí)間,往往需要精確到毫秒甚至微秒級(jí)別。
在目前的嵌入式系統(tǒng)開發(fā)中,考慮到成本等各方面的因素,CPU本身提供了對(duì)于串口通信端口的支持,一般是支持一到二路串口的支持。因此,在需要多于兩路串口的應(yīng)用中,必須要在硬件中增加相關(guān)通信芯片來擴(kuò)展串口。在CPU與擴(kuò)展芯片之間的連接方式有基于GPIO的連接方式以及基于PCI或PCIe總線連接方式;其中,通過基于GPIO的連接方式去實(shí)現(xiàn)CPU與擴(kuò)展芯片之間連接不僅存在軟件工作量很大,而且在實(shí)時(shí)性方面要實(shí)現(xiàn)起來有難度;基于PCI或PCIe總線連接方式,則需要消耗PCI或PCIe總線資源。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明需要解決的技術(shù)問題是提供一種多路串口通信方法,能夠便捷地實(shí)現(xiàn)實(shí)時(shí)嵌入式系統(tǒng)中的多路串口通信任務(wù),在降低總線資源消耗的基礎(chǔ)上,提高系統(tǒng)開發(fā)與調(diào)試效率。
為解決上述技術(shù)問題,本發(fā)明所采取的技術(shù)方案如下。
基于Local Bus總線的多路RS422串口通信方法, 該方法基于多路RS422串口通信裝置以及實(shí)時(shí)操作系統(tǒng)VxWorks實(shí)現(xiàn),多路RS422串口通信裝置包括CPU最小系統(tǒng)、UART芯片、晶振電路以及N個(gè)RS422轉(zhuǎn)換芯片,所述UART芯片與CPU最小系統(tǒng)之間通過Local Bus總線連接,UART芯片與RS422轉(zhuǎn)換芯片之間通過差分信號(hào)線連接;晶振電路與UART芯片連接;
所述方法具體包括以下步驟:
A.CPU最小系統(tǒng)調(diào)用操作系統(tǒng)所規(guī)定的標(biāo)準(zhǔn)用戶接口層API函數(shù)與上層應(yīng)用相互通信;
B.設(shè)置UART芯片與CPU最小系統(tǒng)之間的Local Bus總線;
C.設(shè)置多路RS422驅(qū)動(dòng)程序;
D.采用中斷服務(wù)觸發(fā)相應(yīng)通道的RS422轉(zhuǎn)換芯片進(jìn)行數(shù)據(jù)通信。
上述基于Local Bus總線的多路RS422串口通信方法,步驟B中的Local Bus總線包括控制總線、地址總線和數(shù)據(jù)總線,控制總線包括LCS片選信號(hào)線、INT中斷控制線、ER/W讀寫使能信號(hào)以及RST復(fù)位信號(hào)線。
上述基于Local Bus總線的多路RS422串口通信方法,步驟C具體包括以下步驟:
C1.初始化UART芯片參數(shù);
C2.設(shè)置每個(gè)通道設(shè)備的中斷連接;
C3.RS422驅(qū)動(dòng)函數(shù)注冊(cè);
C4.在VxWorks操作系統(tǒng)中為每個(gè)通道創(chuàng)建相應(yīng)設(shè)備并與相應(yīng)的RS422轉(zhuǎn)換芯片關(guān)聯(lián)。
上述基于Local Bus總線的多路RS422串口通信方法,步驟C1中所述的UART芯片參數(shù)包括通信模式、中斷號(hào)、波特率以及晶振參數(shù)。
上述基于Local Bus總線的多路RS422串口通信方法,步驟C3中所述的RS422驅(qū)動(dòng)函數(shù)包括Open,Close,Read,Write和Ioctrl函數(shù)。
上述基于Local Bus總線的多路RS422串口通信方法,步驟C4具體包括以下步驟:
C41.為每個(gè)通道設(shè)置不同的中斷號(hào);
C42.關(guān)聯(lián)中斷號(hào)與中斷函數(shù);
C43.調(diào)用RS422驅(qū)動(dòng)函數(shù)注冊(cè)到操作系統(tǒng)中;
C44.與相應(yīng)的RS422轉(zhuǎn)換芯片關(guān)聯(lián)。
上述基于Local Bus總線的多路RS422串口通信方法,步驟D所述中斷服務(wù)具體包括以下步驟:
D1.獲取引發(fā)中斷的通道號(hào)i;
D2.關(guān)閉i通道中斷;
D3.讀取UART芯片i通道的IIS狀態(tài)寄存器,獲取UART芯片中的中斷類型;
D4.根據(jù)中斷類型進(jìn)行相應(yīng)數(shù)據(jù)處理;
D5.數(shù)據(jù)處理完成后,打開i通道中斷。
上述基于Local Bus總線的多路RS422串口通信方法,步驟D4包括以下內(nèi)容:
D41.判斷中斷信號(hào)是否異常,如中斷信號(hào)異常,進(jìn)行異常處理;如中斷信號(hào)正常,則進(jìn)行步驟D42;
D42.CPU最小系統(tǒng)指令判斷是否接收有效中斷,如是,進(jìn)行數(shù)據(jù)接收;如否,則進(jìn)行步驟D43;
D43. CPU最小系統(tǒng)指令判斷是否發(fā)送有效中斷,如是,進(jìn)行數(shù)據(jù)發(fā)送;如否,打開i通道中斷。
由于采用了以上技術(shù)方案,本發(fā)明所取得技術(shù)進(jìn)步如下。
本發(fā)明能夠便捷地實(shí)現(xiàn)實(shí)時(shí)嵌入式系統(tǒng)中的多路串口通信任務(wù),具有易于擴(kuò)展、實(shí)時(shí)性強(qiáng)、軟件開發(fā)工作量大幅減少的優(yōu)點(diǎn),能夠滿足系統(tǒng)多層次需求。另外,本發(fā)明的應(yīng)用,能夠在降低總線資源消耗的基礎(chǔ)上,提高系統(tǒng)的開發(fā)與調(diào)試效率。
附圖說明
圖1為本發(fā)明的整體流程圖;
圖2為本發(fā)明所述多路RS422驅(qū)動(dòng)設(shè)置的流程圖;
圖3為本發(fā)明所述中斷服務(wù)程序的流程圖。
具體實(shí)施方式
下面將結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。
一種基于Local Bus總線的多路RS422串口通信方法, 該方法基于多路RS422串口通信裝置以及實(shí)時(shí)操作系統(tǒng)VxWorks實(shí)現(xiàn)。
本發(fā)明中的多路RS422串口通信裝置包括CPU最小系統(tǒng)、UART芯片、晶振電路以及N個(gè)RS422轉(zhuǎn)換芯片, UART芯片與CPU最小系統(tǒng)之間通過Local Bus總線連接,UART芯片與RS422轉(zhuǎn)換芯片之間通過差分信號(hào)線連接;晶振電路與UART芯片連接。
CPU最小系統(tǒng)即Local Bus控制器,用于控制Local Bus總線;本實(shí)施例中優(yōu)選CS51單片機(jī)。UART 芯片完成數(shù)據(jù)收發(fā)的串、并轉(zhuǎn)換。RS422轉(zhuǎn)換芯片選擇全雙工高速RS422 通信接口轉(zhuǎn)換芯片,具有輸出短路保護(hù)功能以及接收失效保護(hù)功能,通過減少由長(zhǎng)線引起的內(nèi)部信號(hào)干擾來增加可靠通信的距離與速度。晶振電路用于為UART 芯片提供數(shù)據(jù)傳送的時(shí)鐘,
Local Bus總線也稱為CPU總線, 根據(jù)高低位地址線序的差異,又可分為Motorola CPU總線和Intel CPU總線。由于Local Bus總線是直接從60X總線上通過橋片分出來的,所以它和60X總線是同步同頻的,進(jìn)行數(shù)據(jù)數(shù)據(jù)讀寫時(shí)與60X總線共享帶寬,不需要內(nèi)核提供額外的處理。
Local Bus總線包括三部分控制總線、地址總線和數(shù)據(jù)總線。
控制總線,包括LCS片選信號(hào)線、INT中斷控制線、ER/W讀寫使能信號(hào)以及RST復(fù)位信號(hào)線。LCS片選信號(hào)線用于選擇相應(yīng)的UART芯片;由于多路RS422串口通信裝置設(shè)置了N個(gè) RS-422通道,則需要有N條不同的LCS片選信號(hào)線來連接CPU最小系統(tǒng)和UART芯片,因此每一條LCS片選信號(hào)線對(duì)應(yīng)一個(gè)RS-422通道的選擇;當(dāng)關(guān)聯(lián)某通道的片選信號(hào)為低電平時(shí)表示該通道被選中,即CPU最小系統(tǒng)可以對(duì)其進(jìn)行讀寫操作。INT中斷信號(hào)線用于在UART芯片中某通道的接收數(shù)據(jù)緩沖器接收到有效數(shù)據(jù)或者發(fā)送緩沖器滿或其它異常事件產(chǎn)生時(shí)產(chǎn)生中斷事件,告知CPU最小系統(tǒng),然后由CPU最小系統(tǒng)產(chǎn)生中斷響應(yīng);由于N個(gè)RS-422通道也需要有N條不同的中斷信號(hào)線,不同的中斷信號(hào)表示不同的UART芯片通道產(chǎn)生中斷事件。ER/W讀寫使能信號(hào),低電平有效,讀寫使能信號(hào)為低電平時(shí),表示在進(jìn)行讀或者寫操作,在異步傳輸模式下,它與片選信號(hào)線配合對(duì)讀或者寫數(shù)據(jù)進(jìn)行采樣。RST復(fù)位信號(hào)線實(shí)現(xiàn)UART芯片的復(fù)位。
地址總線用于選擇UART芯片中的寄存器。由于UART芯片訪問空間很小,只有8個(gè)寄存器地址,因此可以使用三根地址總線來連接CPU最小系統(tǒng)和UART芯片,當(dāng)某通道片選信號(hào)變?yōu)榈碗娖?,即某通道被選定后,通過LA0~LA2來實(shí)現(xiàn)該通道中不同寄存器的訪問,從而實(shí)現(xiàn)RS-422串口數(shù)據(jù)收發(fā)或其它工作。
數(shù)據(jù)總線用于實(shí)現(xiàn)CPU最小系統(tǒng)與UART芯片的數(shù)據(jù)傳輸,為雙向數(shù)據(jù)傳輸。根據(jù)UART芯片模式,數(shù)據(jù)總線的數(shù)據(jù)位寬有8位或16位之分,根據(jù)數(shù)據(jù)位寬的多少,數(shù)據(jù)總線信號(hào)線也相應(yīng)改變。當(dāng)發(fā)送數(shù)據(jù)時(shí),將CPU最小系統(tǒng)寫入U(xiǎn)ART芯片發(fā)送FIFO 中的并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù),并通過RS422轉(zhuǎn)換芯片發(fā)送出去;當(dāng)接收數(shù)據(jù)時(shí), 將RS422轉(zhuǎn)換芯片接收到的外部串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)存入U(xiǎn)ART 芯片的接收FIFO 中, 供CPU讀取。
多路RS422串口通信方法的整體流程如圖1所示,具體包括以下步驟。
A.CPU最小系統(tǒng)調(diào)用操作系統(tǒng)所規(guī)定的標(biāo)準(zhǔn)用戶接口層API函數(shù)與上層應(yīng)用相互通信,為上層應(yīng)用提供服務(wù)。
本發(fā)明的通信方法是基于實(shí)時(shí)操作系統(tǒng)VxWorks實(shí)現(xiàn)的,故以字符設(shè)備的形式向VxWorks操作系統(tǒng)的 I/O層注冊(cè)讀寫和控制函數(shù)。其對(duì)上層應(yīng)用注冊(cè)的讀寫和控制函數(shù)如下:RS422Open:RS422設(shè)備打開函數(shù),對(duì)應(yīng)應(yīng)用層接口函數(shù)open;RS422Close:RS422設(shè)備關(guān)閉函數(shù),對(duì)應(yīng)應(yīng)用層接口函數(shù)close;RS422Read,:RS422設(shè)備字符讀取函數(shù),對(duì)應(yīng)應(yīng)用層接口函數(shù)read;RS422Write:RS422設(shè)備字符發(fā)送函數(shù),對(duì)應(yīng)應(yīng)用層接口函數(shù)write;RS422Ioctrl:RS422設(shè)備控制函數(shù),對(duì)應(yīng)應(yīng)用層接口函數(shù)ioctl函數(shù)。
如果是寫操作,在I/O層調(diào)用write函數(shù)寫設(shè)備時(shí),RS422Write函數(shù)要主動(dòng)調(diào)用底層RS422驅(qū)動(dòng)程序的相關(guān)函數(shù)來發(fā)送字符數(shù)據(jù)。如果是讀操作,RS422Read函數(shù)則直接在緩沖區(qū)中讀取字符;當(dāng)緩沖區(qū)為空時(shí),如果是阻塞方式需要等待,如果是非阻塞方式則立即返回錯(cuò)誤;該緩沖區(qū)的填充是由底層RS422驅(qū)動(dòng)程序通過中斷方式進(jìn)行,當(dāng)?shù)讓域?qū)動(dòng)接受到一個(gè)字符時(shí),產(chǎn)生中斷,然后提供回調(diào)函數(shù)將字符寫入緩沖區(qū)中以供上層應(yīng)用讀取。
B.設(shè)置UART芯片與CPU最小系統(tǒng)之間的Local Bus總線。
C.設(shè)置多路RS422驅(qū)動(dòng)程序。
C1.初始化UART芯片參數(shù);UART芯片參數(shù)包括通信模式、中斷號(hào)、波特率以及晶振參數(shù)。
C2.設(shè)置每個(gè)通道設(shè)備的中斷連接。
C3.RS422驅(qū)動(dòng)函數(shù)注冊(cè);RS422驅(qū)動(dòng)函數(shù)包括Open,Close,Read,Write和Ioctrl函數(shù)。
C4.在VxWorks操作系統(tǒng)中為每個(gè)通道創(chuàng)建相應(yīng)設(shè)備,并與相應(yīng)的RS422轉(zhuǎn)換芯片關(guān)聯(lián)。
步驟C的流程如圖2所示,具體包括以下操作。
C41.為每個(gè)通道設(shè)置不同的中斷號(hào)。
C42.關(guān)聯(lián)中斷號(hào)與中斷函數(shù)。
C43.調(diào)用RS422驅(qū)動(dòng)函數(shù)注冊(cè)到操作系統(tǒng)中。
C44.與相應(yīng)的RS422轉(zhuǎn)換芯片關(guān)聯(lián)。
D.采用中斷服務(wù)觸發(fā)相應(yīng)通道的RS422轉(zhuǎn)換芯片進(jìn)行數(shù)據(jù)通信。主要包括向上層提供回調(diào)函數(shù)注冊(cè)功能,例如啟動(dòng)發(fā)送數(shù)據(jù)函數(shù);完成不同通道的通信設(shè)置,主要是設(shè)置地址空間映射,通過訪問不同地址區(qū)間實(shí)現(xiàn)對(duì)不同通道的訪問;控制通道進(jìn)行字符接收和發(fā)送及其他硬件配置工作。本發(fā)明通過中斷方式迸行數(shù)據(jù)的接收和發(fā)送,當(dāng)然也可采用輪詢方式進(jìn)行數(shù)據(jù)接收和發(fā)送。
為實(shí)現(xiàn)回調(diào)函數(shù)的注冊(cè),定義數(shù)據(jù)結(jié)構(gòu)為RS422DRV_FUNCS結(jié)構(gòu)體,該結(jié)構(gòu)體中所有成員都是函數(shù)指針,RS422轉(zhuǎn)換芯片的設(shè)置對(duì)應(yīng)函數(shù)完成相應(yīng)功能,并將這些函數(shù)地址對(duì)RS422DRV_FUNCS結(jié)構(gòu)體進(jìn)行初始化,然后通知給UART芯片。
地址空間映射是指將Local Bus總線設(shè)備的訪問轉(zhuǎn)換到CPU最小系統(tǒng)的內(nèi)存空間中。Local Bus內(nèi)部事務(wù)地址只能為32位,所以所有片選必須落在4G窗口之內(nèi)。當(dāng)一個(gè)內(nèi)存事務(wù)被指派到LBC上時(shí),內(nèi)部事務(wù)地址就跟每個(gè)BANK的地址信息相比較,相應(yīng)的芯片就跟該BANK關(guān)聯(lián)起來,直到事務(wù)結(jié)束。對(duì)應(yīng)每個(gè)BANK的寄存器主要有兩個(gè),一個(gè)是Base Register(縮稱BR),BR寄存器包含BANK所對(duì)應(yīng)的基地址和類型;另外一個(gè)是Option Register(縮稱OR),OR寄存器主要設(shè)置BANK的大小和訪問屬性。通過對(duì)Local Bus寄存器進(jìn)行設(shè)置后,便能通過訪問特定地址空間實(shí)現(xiàn)掛在總線上設(shè)備的片選和其它操作。
其中,步驟D中的中斷服務(wù)流程如圖3所示,具體包括以下操作。
D1.獲取引發(fā)中斷的通道號(hào)i;
D2.關(guān)閉i通道中斷;
D3.讀取UART芯片i通道的IIS狀態(tài)寄存器,獲取UART芯片中的中斷類型;
D4.根據(jù)中斷類型進(jìn)行相應(yīng)數(shù)據(jù)處理;
D41.判斷中斷信號(hào)是否異常,如中斷信號(hào)異常,進(jìn)行異常處理并恢復(fù)中斷狀態(tài);如中斷信號(hào)正常,則進(jìn)行步驟D42;
D42. CPU最小系統(tǒng)指令判斷是否接收有效中斷,如是,進(jìn)行數(shù)據(jù)接收,將UART芯片F(xiàn)IFO中的數(shù)據(jù)讀入到系統(tǒng)中,然后再調(diào)用回調(diào)函數(shù)將數(shù)據(jù)放到CPU最小系統(tǒng)相應(yīng)的緩存中;如否,則進(jìn)行步驟D43;
D43. CPU最小系統(tǒng)指令判斷是否發(fā)送有效中斷,如是,進(jìn)行數(shù)據(jù)發(fā)送UART芯片的發(fā)送寄存器發(fā)送數(shù)據(jù);如否,打開i通道中斷。
D5.數(shù)據(jù)處理完成后,打開i通道中斷,繼續(xù)等待下一個(gè)中斷信號(hào)。
本發(fā)明應(yīng)用過程中,只需重復(fù)步驟D即可,即當(dāng)有讀/寫操作請(qǐng)求時(shí),采用中斷服務(wù)觸發(fā)相應(yīng)通道的RS422轉(zhuǎn)換芯片進(jìn)行數(shù)據(jù)通信即可。