uCOS-II的嵌入式串口通信模塊設計
3 串口通信模塊的設計
每個(gè)串行端口有兩個(gè)環(huán)狀隊列緩沖區,同時(shí)有兩個(gè)信號量:一個(gè)用來(lái)指示接收字節,另一個(gè)用來(lái)指示發(fā)送字節。每個(gè)環(huán)狀緩沖區有以下四個(gè)要素:
- 存儲數據(INT8U數組);
- 包含環(huán)狀緩沖區字節數的計數器;
- 環(huán)狀緩沖區中指向將被放置的下一字節的指針;
- 環(huán)狀緩沖區中指向被取出的下一字節的指針。
圖3是接收數據軟件模塊的流程圖。SerialGetehar()用來(lái)獲取接收到的數據,如果緩沖區已空時(shí)將任務(wù)掛起,接收到字節時(shí),任務(wù)將被喚醒,同時(shí)從串行口接收字節。SerialPutRxChar()用來(lái)將接收的字節放到緩沖區中,如果接收緩沖區已滿(mǎn),則該字節被丟棄。當字節插入到緩沖區中,SerialPutRxChar()通知數據接收信號量,使之將數據己到的消息傳達給所有等待的任務(wù)。為防止掛起應用任務(wù),可以通過(guò)調用 SceiallsEmPty()去發(fā)現環(huán)狀隊列中是否有字節。
圖4是發(fā)送數據模塊的流程圖。當需要發(fā)送數據給串行端口時(shí),SerialPurChar()等待信號量在初始化發(fā)送信號量時(shí)應該初始為緩沖區的大小。因此,當緩沖區中沒(méi)有更多空間時(shí),SerialPutChar()就掛起任務(wù),只要UART再次發(fā)送字節,掛起任務(wù)就將恢復。 SerialGctChar()被中斷服務(wù)程序調用,如果發(fā)送緩沖區至少還有一個(gè)字節,Seri-a1GetChar()就返回一個(gè)從緩沖區發(fā)送的字節。如果緩沖區己空,則SerialGetChar()返回Null,這將使調用停止進(jìn)一步的發(fā)送中斷,一直到有數據發(fā)送為止。
4 異步串行通信的接口函數
應用任務(wù)可以通過(guò)如下的幾個(gè)函數來(lái)控制和訪(fǎng)問(wèn)UART:SerialCfgPort()、SerialGetChar()、SerialInit()、SerialIsEmpty()、SerialIsFull()和SerialPutChar()。
SerialCfgPort()用于建立串行端口的特征,在為指定端口調用其他服務(wù)前,必須先調用該函數,包括確定波特率、比特數、奇偶校驗和停止位等。
SerialGetChar()使應用程序從接收數據的環(huán)狀緩沖區中取出數據。
SerialInit()用于初始化整個(gè)串口軟件模塊,且必須在該模塊提供的其他任何服務(wù)前調用。SeriallInit()將環(huán)狀緩沖區計數器的字節數清零,并初始化每個(gè)環(huán)狀緩沖區的IN和OUT指針,指向數據存儲區的開(kāi)始處。數據接收信號量初始化為0,表示在環(huán)狀緩沖區無(wú)數據。用傳送緩沖區大小初始化數據傳送信號量,表示緩沖區已空。
SerialIsEmpty()允許應用程序確定是否有字節從串口接收進(jìn)來(lái)。本函數允許在無(wú)數據時(shí)避免將任務(wù)掛起。
SerialIsFull()允許應用程序確定傳送環(huán)狀緩沖區的狀態(tài),本函數可以在緩沖區已滿(mǎn)時(shí)避免將任務(wù)掛起。
SerialPutChar()允許應用程序向一個(gè)串行端口發(fā)送數據。
結 語(yǔ)
該串口通信模塊充分利用了實(shí)時(shí)內核的任務(wù)調度功能和信號量機制,系統軟件模塊化,可讀性增強,便于修改和移植,其設計思路和方法可以很好的應用在多種情況下的測控系統中,系統的擴展方便,具有一定的借鑒作用。該串口通信模塊已作為某鐵路供水遠程控制終端的一部分,運行穩定,提高了整個(gè)系統的運行效率和實(shí)時(shí)性。
評論