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语言数据结构之管道浅析相关推荐
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案
<<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...
- 一些可运行的C语言数据结构代码
网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...
- C语言数据结构学习用单元测试
药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...
- 顺序表输入栈元素c语言,C语言数据结构之栈简单操作
C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...
- 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解
C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...
- 厦门理工C语言实验报告8,厦门理工c语言数据结构实验
<厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...
- 【c语言数据结构】二叉树
c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树(Binary tree)是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单 ...
- c语言数据结构插入算法说明,C语言数据结构插入算法
C语言数据结构插入算法 C语言数据结构插入算法 C语言数据结构 数据结构学习 ->是二目运算符 p->a 引用了指针p指向的结构体的成员a. 整合 void unionL(List *La ...
- matlab高级数据结构,Matlab讲义-第四章Matlab语言数据结构1-10.pdf
Matlab讲义-第四章Matlab语言数据结构1-10.pdf 第四章第四章 Matlab语言基础语言基础 Matlab语言程序简洁.可语言程序简洁.可 读性很强而且调试十分容易.读性很强而且调试十 ...
最新文章
- 【★】KMP算法完整教程
- Mikrotik RouterOS 日常问题解析 ROS 5.4下载
- android广告页白屏_android 白屏
- IPTABLES简单应用说明和Linux下IPTABLES配置详解
- QT 中QPainter绘制文字、图片
- asp.net 动态创建TextBox控件 如何加载状态信息
- html中scope的作用,AngularJS 作用域(Scope)
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python输入和输出)
- mongodb 数组查询 php,关于PHP,查询mongodb里的数组的问题
- 一种增强的md5加密算法
- 移动应用后端应该使用 AWS 还是 Firebase?
- 解决windows10下总是很快进入睡眠问题
- BOS Studio(金蝶BOS)的简单介绍
- 双十一,程序员可太难了
- java8 lambda 处理分类和子分类的技巧
- linux 7分区 fdisk,CentOS7创建逻辑卷,fdisk分区方式。
- Lesson 13-14 How often do you exercise?
- 使用Excel宏功能将考勤记录生成上班工时表
- Error setting expression 'file' with value '[Ljava.lang.String;@f0ceb'
- Qt官方示例-计算器