18.7
實(shí)驗(yàn)3:基于環(huán)形隊(duì)列的UART收發(fā)回顯
在實(shí)際項(xiàng)目開發(fā)中,由于有些串口不具備FIFO(如SCI1和SCI2)或FIFO的buffer比較小,這可能會(huì)在數(shù)據(jù)處理速度小于數(shù)據(jù)接收速度的時(shí)候,導(dǎo)致數(shù)據(jù)的丟失。因此我們可以設(shè)計(jì)一個(gè)隊(duì)列來避免這一問題。在本實(shí)驗(yàn)中,我們使用環(huán)形隊(duì)列來實(shí)現(xiàn)實(shí)驗(yàn)1的串口收發(fā)回顯,將串口接收到的數(shù)據(jù)暫存在隊(duì)列中,待完成一次接收后再將隊(duì)列中的數(shù)據(jù)全部發(fā)出去。
隊(duì)列是一種特殊的線性表,只允許在隊(duì)列頭(head)刪除元素,在隊(duì)列尾(tail)添加元素。當(dāng)隊(duì)列添加一個(gè)元素,隊(duì)列尾向后移動(dòng),當(dāng)隊(duì)列刪除一個(gè)元素,同樣,刪除一個(gè)元素,隊(duì)列頭向后移動(dòng),如圖19_18。

圖19-18 隊(duì)列圖示
由于存儲(chǔ)空間是有限的,如果使用線性隊(duì)列,刪除元素后就會(huì)空出一段存儲(chǔ)空間,這會(huì)造成很大的浪費(fèi)。因此實(shí)際上我們更多使用環(huán)形隊(duì)列。并不是說這段存儲(chǔ)空間是環(huán)形的,而是頭指針和尾指針到達(dá)存儲(chǔ)空間末尾后會(huì)回到存儲(chǔ)空間起點(diǎn)。因此在邏輯上這是循環(huán)的,如圖19_19。

圖19-19 環(huán)形隊(duì)列
18.7.1
硬件設(shè)計(jì)
本實(shí)驗(yàn)使用到開發(fā)板的串口和LED燈,其原理圖在本章實(shí)驗(yàn)1和前面的點(diǎn)亮LED燈章節(jié)有介紹,這里不進(jìn)行贅述。
18.7.2
軟件設(shè)計(jì)
18.7.2.1
新建工程
因?yàn)楸竟?jié)的UART實(shí)驗(yàn)例程與上一個(gè)實(shí)驗(yàn)例程的FSP配置以及UART相關(guān)的一些代碼基本一致,因此我們可以直接以前面的“19_UART_Receive_Send”工程為基礎(chǔ)進(jìn)行修改。
對(duì)于e2studio開發(fā)環(huán)境:拷貝一份我們之前的e2s工程模板“19_UART_Receive_Send”,然后將工程文件夾重命名為“19_UART_Circular_Queue”,最后再將它導(dǎo)入到我們的e2studio工作空間中。
對(duì)于Keil開發(fā)環(huán)境:拷貝一份我們之前的Keil工程模板“19_UART_Receive_Send”,然后將工程文件夾重命名為“19_UART_Circular_Queue”,并進(jìn)入該文件夾里面雙擊Keil工程文件,打開該工程。
FSP配置完全一致,因此我們省略掉這部分。
18.7.2.2
環(huán)形隊(duì)列的實(shí)現(xiàn)
列表8:代碼清單19-7:環(huán)形隊(duì)列頭文件內(nèi)容
左右滑動(dòng)查看完整內(nèi)容
#defineDATA_LEN300//隊(duì)列緩存大小 typedefstruct { uint16_thead;//頭指針 uint16_ttail;//尾指針 uint8_tdata[DATA_LEN];//隊(duì)列數(shù)據(jù) }Circular_queue_t; externCircular_queue_tCircular_queue;//環(huán)形隊(duì)列全局變量 boolQueue_Init(Circular_queue_t*circular_queue);//初始化隊(duì)列 boolQueue_isEmpty(Circular_queue_t*circular_queue);//判斷隊(duì)列是否為空 boolQueue_isFull(Circular_queue_t*circular_queue);//判斷隊(duì)列是否已滿 boolQueue_Wirte(Circular_queue_t*circular_queue,uint8_t*string, uint16_ →t len);//寫數(shù)據(jù) boolQueue_Read(Circular_queue_t*circular_queue,uint8_t*string,uint16_t? →len);//讀數(shù)據(jù) uint16_tQueue_HadUse(Circular_queue_t *circular_queue);//返回隊(duì)列中數(shù)據(jù)的長(zhǎng)度 uint16_tQueue_NoUse(Circular_queue_t*circular_queue);//返回未使用數(shù)據(jù)的長(zhǎng)度
環(huán)形隊(duì)列相關(guān)函數(shù)的具體定義可以在例程的circular_queue.c中查看,這里就不贅述了。
18.7.2.3
串口中斷回調(diào)函數(shù)
debug_uart4_callback串口中斷回調(diào)函數(shù)的內(nèi)容修改成如下所示。
列表9:代碼清單19-8:串口中斷回調(diào)函數(shù)
左右滑動(dòng)查看完整內(nèi)容
/*串口中斷回調(diào)*/
voiddebug_uart4_callback(uart_callback_args_t* p_args)
{
switch(p_args->event)
{
caseUART_EVENT_RX_CHAR:
{
/*接收到數(shù)據(jù)后馬上寫入隊(duì)列中*/
Queue_Wirte(&Circular_queue,(uint8_t*) &p_args->data,1);
break;
}
caseUART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag=true;
break;
}
default:
break;
}
}
18.7.2.4
hal_entry入口函數(shù)
hal_entry入口函數(shù)的內(nèi)容修改成如下所示。
列表10:代碼清單19-9:hal_entry入口函數(shù)
左右滑動(dòng)查看完整內(nèi)容
voidhal_entry(void)
{
/*TODO:add your own code here */
uint8_tRead_Buffer[DATA_LEN];
uint16_tRead_Length;
LED_Init();
// LED 初始化
Debug_UART4_Init();// SCI4 UART 調(diào)試串口初始化
Queue_Init((Circular_queue_t*)&Circular_queue);//環(huán)形隊(duì)列初始化
printf("這是一個(gè)串口環(huán)形隊(duì)列例程
");
printf("打開串口助手發(fā)送數(shù)據(jù) 5 個(gè)及以上的數(shù)據(jù),接收窗口會(huì)打印所發(fā)送的數(shù)據(jù)
");
while(1)
{
if(Queue_isEmpty(&Circular_queue) ==false)//判斷隊(duì)列中的數(shù)據(jù)不為空
{
Read_Length =Queue_HadUse(&Circular_queue);
if( Read_Length >=5)
// 如果隊(duì)列中的數(shù)據(jù)大于等于 5 個(gè),開始打印
隊(duì)列中的所有數(shù)據(jù)
{
printf("Read_Length=%d: ", Read_Length);
memset(Read_Buffer,0, DATA_LEN);
/* 讀出 Read_Length 個(gè)數(shù)據(jù) */
Queue_Read(&Circular_queue, Read_Buffer, Read_Length);
printf("%s
", Read_Buffer);
}
}
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
18.7.3
下載驗(yàn)證
保證開發(fā)板相關(guān)硬件連接正確,用Type-CUSB線連接開發(fā)板“USBTOUART”接口跟電腦。本次實(shí)驗(yàn)需要使用到串口調(diào)試助手,配置好串口參數(shù)并打開串口后,在調(diào)試助手的發(fā)送區(qū)域輸入超過5個(gè)的任意字符并點(diǎn)擊發(fā)送,即可在接收區(qū)看見返回字符,不一定馬上全部返回全部的已發(fā)送的字符,可以多發(fā)送幾次數(shù)據(jù)觀察,數(shù)據(jù)并沒有丟失。
-
led燈
+關(guān)注
關(guān)注
22文章
1603瀏覽量
110829 -
fifo
+關(guān)注
關(guān)注
3文章
403瀏覽量
45377 -
串口
+關(guān)注
關(guān)注
15文章
1602瀏覽量
81586 -
uart
+關(guān)注
關(guān)注
22文章
1292瀏覽量
105832
原文標(biāo)題:實(shí)驗(yàn)3:基于環(huán)形隊(duì)列的UART收發(fā)回顯——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(49)
文章出處:【微信號(hào):瑞薩嵌入式小百科,微信公眾號(hào):瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
UART波特率計(jì)算及UART收發(fā)回顯實(shí)驗(yàn)
環(huán)形隊(duì)列在串口數(shù)據(jù)接收中的使用
如何使用隊(duì)列實(shí)現(xiàn)STM32串口環(huán)形緩沖?
如何將DMA和環(huán)形的FIFO隊(duì)列結(jié)合在一起來使用呢
實(shí)現(xiàn)隊(duì)列環(huán)形緩沖的方法
環(huán)形隊(duì)列的相關(guān)資料分享
環(huán)形隊(duì)列的操作如何去實(shí)現(xiàn)呢
深度解析數(shù)據(jù)結(jié)構(gòu)與算法篇之隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)
【STM32+cubemx】0005 HAL庫開發(fā):uart串口中斷和fifo環(huán)形隊(duì)列
基于STM32的串口環(huán)形隊(duì)列IAP調(diào)試心得
嵌入式環(huán)形隊(duì)列和消息隊(duì)列的實(shí)現(xiàn)
嵌入式環(huán)形隊(duì)列和消息隊(duì)列是如何去實(shí)現(xiàn)的?
裸機(jī)中環(huán)形隊(duì)列與RTOS中消息隊(duì)列有何區(qū)別呢?

基于環(huán)形隊(duì)列的UART收發(fā)回顯實(shí)驗(yàn)
評(píng)論