C语言数据结构之管道浅析
生活随笔
收集整理的這篇文章主要介紹了
C语言数据结构之管道浅析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
管道是什么?
管道是先進先出的數據結構,相當于一個緩沖區;
數據長度一般是1Byte,這里設置管道緩沖區為512Byte;
管道的作用是?
有時候需要一定長度的數據,不僅僅是1Byte;
實現思路:申請緩沖區
》使用兩個指針分別指向緩沖區的首地址和尾地址,例如begin,end
—》要實現隨時找到管道中任意一個成員,使用兩個指針分別指向第一個成員(head)和最后一個成員(tail)
—》使用環形緩沖區存儲數據
如何使用管道?
以下程序的管道 = 管道結構體+緩沖區;
//定義一個管道結構體 typedef struct _Pipe_t {uint8_t * beginPtr; //管道內存塊首地址uint8_t * headPtr; //管道元素首部,指向下一個要存儲的地址uint8_t * tailPtr; //管道元素尾部,指向下一個要讀取的地址uint8_t * endPtr; //管道內存塊尾部 ,最后一個內存地址+1 } Pipe_t;//初始化管道,申請緩沖區 //參數1:結構體指針 //參數2:緩沖區(數組)首地址 //參數3:緩沖區大小 //示例:pipe_init(&TLSR8266_pipe, (uint8_t *)Usart3_buff,USART3_BUFF_SIZE); void pipe_init(Pipe_t *pipe, uint8_t * buffer, uint16_t size) { (*pipe).beginPtr = buffer; (*pipe).headPtr = buffer; (*pipe).tailPtr = buffer; (*pipe).endPtr = buffer+size; }//從管道中讀取數據 //參數1:管道名 //參數2:讀取數值,存放到value //示例:pipe_read(&TLSR8266_pipe, &buf[4]); bool pipe_read(Pipe_t *pipe, uint8_t * value) {if((*pipe).headPtr != (*pipe).tailPtr){*value = *((*pipe).tailPtr);(*pipe).tailPtr++;if((*pipe).tailPtr == (*pipe).endPtr)(*pipe).tailPtr = (*pipe).beginPtr;return true;}else{*value = 0xFF;//也可以是0x00吧return false;} }//向管道寫入數據 //參數1:管道名 //參數2:要寫入的數值 //示例:pipe_write(&TLSR8266_pipe,ch); //一般用于中斷服務函數里面讀取到的數據,寫入; bool pipe_write(Pipe_t *pipe, uint8_t value) {if((*pipe).headPtr != (*pipe).tailPtr - 1)//判斷管道元素首部是否與管道元素尾部相同,相同表示存滿{if(((*pipe).headPtr != (*pipe).endPtr -1) || ((*pipe).tailPtr != (*pipe).beginPtr))//判斷管道元素首部是否存放到管道尾地址,或者管道元素尾部是否存放到管道首地址{*((*pipe).headPtr) = value; //數據存放到管道元素首部(*pipe).headPtr++; //管道元素首部向后移一位if((*pipe).headPtr == (*pipe).endPtr)//如果管道元素首部等于管道尾地址,即存滿管道了{(*pipe).headPtr = (*pipe).beginPtr;//管道元素首部指向管道首地址(環形內存)}return true;}else{return false;}}else{return false;} }下面以TLRS 8266的藍牙模塊為例,使用管道存儲和讀取藍牙數據
//初始化藍牙模塊的時候,應該一起初始化管道,也是申請一個管道; pipe_init(&TLSR8266_pipe, (uint8_t *)Usart3_buff,USART3_BUFF_SIZE);//主要用途是使用管道存儲和讀取藍牙數據//封裝“pipe_read”函數 /********************************************************** **函數功能:讀取AT指令發送后返回的值 **buf數組大小固定為6個元素 ***********************************************************/ static void TLSR8266_ReadReturn(unsigned char* buf) {pipe_read(&TLSR8266_pipe, &buf[0]);pipe_read(&TLSR8266_pipe, &buf[1]);pipe_read(&TLSR8266_pipe, &buf[2]);pipe_read(&TLSR8266_pipe, &buf[3]);pipe_read(&TLSR8266_pipe, &buf[4]);pipe_read(&TLSR8266_pipe, &buf[5]); } uint8_t buf[6] = {0}; TLSR8266_ReadReturn(buf); printf("buf : %s\r\n",buf);//打印出從管道讀取的數據//藍牙模塊接收手機發送來的數據,存放到管道里面 void USART3_IRQHandler(void) {if(USART_GetFlagStatus(USART3, USART_FLAG_IDLE) != RESET){}if(USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET){USART_ReceiveData(USART3);//接收到數據}//接收完的一批數據,還沒有被處理,則不再接收其他數據if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){uint8_t ch = USART3->DR;USART_ClearITPendingBit (USART3, USART_IT_RXNE);if(TLSR8266_pipe_enable)pipe_write(&TLSR8266_pipe,ch);//向管道寫入數據usart1_putc(ch);//把藍牙接收的數據顯示在串口上 // printf("%x ",ch);//十六進制顯示} }至此,基本完成對管道的使用;
代碼鏈接:https://pan.baidu.com/s/1DUtrQLRgiwj7_tOsszDL-g 密碼:a3xy
總結
以上是生活随笔為你收集整理的C语言数据结构之管道浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python简单开发接口
- 下一篇: Google Desktop 果然