微控制器串列埠 佇列的使用

2021-09-25 06:51:41 字數 2138 閱讀 3379

最近做微控制器開發經常遇見要用串列埠接收資料的情況,實際專案中肯定不能當串列埠接收中斷一來就去處理,於是我們可以用到佇列這個資料結構來儲存上一幀資料,想用的時候取出即可。

新建佇列結構體

#define buffer_max 20		

//佇列緩衝區大小,根據實際情況來定

typedef

struct uart_queueuart_queuetypedef;

uart_queuetypedef uart0_queue;

//新建乙個佇列結構體

接收機制說明:

當資料入隊後,佇列尾指標+1,當資料出隊後,佇列頭指標+1;

當一幀資料完成後,rxlength記錄長度,使用者可以取出相應資料,進行處理。

建立出/入隊函式
//入隊函式

unsigned

char

uart_enqueue

(const

unsigned

char _buf)

else

}//出隊函式

unsigned

char

uart_dequeue

(unsigned

char

* _buf)

else

}

佇列初始化函式
//將佇列全部設為0

void

reset_uart_queue

(void

) uart0_queue.head =0;

uart0_queue.tail =

0;

uart0_queue.rxlength =0;

}

指定個數資料取出函式
//從串列埠緩衝佇列取出指定個數資料

unsigned

char

pop_uart_queue

(unsigned

char

* _data,

unsigned

char num)

if(uart0_queue.head != num)

return0;

//接收失敗

else

return1;

//接收成功

}

接收機制
現在我們來理一理接收機制,當串列埠接收到資料之後,會產生中斷,此時我們得立馬取出資料,接收下乙個,當一位元組接收完之後,5ms內無下一位元組視為一幀資料接收完成

我們定義乙個接收完成標誌***rxfinish_flag***,接收完一幀資料後,我們將這個標誌置位1,取出後復位0,在函式主任務內輪詢監控此標誌狀態,為1則取出資料並做出相應動作。

期間需要計時,要用到定時器,我們先設定定時器0中斷為1ms一次,定義變數***rxtimer_cnt***來計時,

//如果正在接收,判斷資料接收時間是否大於5ms

if(uart0_queue.rxreceiving_flag)

}

串列埠中斷處理
void

rxintcallback

(void

) uart0_queue.rxreceiving_flag=1;

//正在接收

uart_enqueue

(_buf)

;//資料入隊

uart0_queue.rxtimer_cnt=0;

//連續接收計時清零

}

資料處理
主函式中採用輪詢的方式查詢是否接收完成一幀資料,如果接收完成則做出相應處理,此處我是把資料原封不動返回。

//新建靜態陣列來儲存接收到的資料

static uint8_t uart_testarr[buffer_max]=;

while(1

)}

微控制器串列埠配置

串列埠引數配置 usart initstructure.usart baudrate 115200 設定波特率為115200 usart initstructure.usart wordlength usart wordlength 8b 設定資料位為8位 usart initstructure.u...

微控制器串列埠通訊

微控制器串列埠通訊 通常的usb序列通訊方式為全雙工,即兩條資料線 rxd和txd,一條用於傳送資料,一條用於接收資料。在序列通訊前,需要對序列通訊進行配置。對於微控制器 ri為接受中斷標誌位,未通訊時ri 0 當電腦傳送第乙個位元組幀a0到微控制器時,sbuf a0,中斷標誌位ri 1,微控制器呼...

微控制器串列埠通訊

1 需求 實現電腦端控制微控制器開啟燈光風扇,顯示微控制器傳遞過來的資料 如溫度 濕度等 2 工具 平台軟體 驅動人生 vs2012 keil4 3 下面就開始吧 4 檢視我們當前的通訊埠號 如圖 然後確定我們微控制器的晶振,我是用的是11.0592m的 即9600 差不多我們就可以開始我們的開發了...