最近做微控制器開發經常遇見要用串列埠接收資料的情況,實際專案中肯定不能當串列埠接收中斷一來就去處理,於是我們可以用到佇列這個資料結構來儲存上一幀資料,想用的時候取出即可。
新建佇列結構體
#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 差不多我們就可以開始我們的開發了...