管道是什么?

管道是先进先出的数据结构,相当于一个缓冲区;
数据长度一般是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语言数据结构之管道浅析相关推荐

  1. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  2. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  3. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  4. C语言数据结构学习用单元测试

    药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...

  5. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  6. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  7. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验

    <厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...

  8. 【c语言数据结构】二叉树

    c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树(Binary tree)是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单 ...

  9. c语言数据结构插入算法说明,C语言数据结构插入算法

    C语言数据结构插入算法 C语言数据结构插入算法 C语言数据结构 数据结构学习 ->是二目运算符 p->a 引用了指针p指向的结构体的成员a. 整合 void unionL(List *La ...

  10. matlab高级数据结构,Matlab讲义-第四章Matlab语言数据结构1-10.pdf

    Matlab讲义-第四章Matlab语言数据结构1-10.pdf 第四章第四章 Matlab语言基础语言基础 Matlab语言程序简洁.可语言程序简洁.可 读性很强而且调试十分容易.读性很强而且调试十 ...

最新文章

  1. 【★】KMP算法完整教程
  2. Mikrotik RouterOS 日常问题解析 ROS 5.4下载
  3. android广告页白屏_android 白屏
  4. IPTABLES简单应用说明和Linux下IPTABLES配置详解
  5. QT 中QPainter绘制文字、图片
  6. asp.net 动态创建TextBox控件 如何加载状态信息
  7. html中scope的作用,AngularJS 作用域(Scope)
  8. 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python输入和输出)
  9. mongodb 数组查询 php,关于PHP,查询mongodb里的数组的问题
  10. 一种增强的md5加密算法
  11. 移动应用后端应该使用 AWS 还是 Firebase?
  12. 解决windows10下总是很快进入睡眠问题
  13. BOS Studio(金蝶BOS)的简单介绍
  14. 双十一,程序员可太难了
  15. java8 lambda 处理分类和子分类的技巧
  16. linux 7分区 fdisk,CentOS7创建逻辑卷,fdisk分区方式。
  17. Lesson 13-14 How often do you exercise?
  18. 使用Excel宏功能将考勤记录生成上班工时表
  19. Error setting expression 'file' with value '[Ljava.lang.String;@f0ceb'
  20. Qt官方示例-计算器

热门文章

  1. ExtJS 教程目录
  2. ffmpeg解析h264文件,提取图片信息
  3. 【Android自定义View】仿Photoshop取色器ColorPicker(二)
  4. 大数据与云计算期末复习
  5. VS2008(Visual Studio 2008)下载安装步骤
  6. Veritas Backup Exec 21.3 Multilingual (Windows)
  7. 诺基亚N8-00测评
  8. 亭台六七座,八九十枝花——python正则表达
  9. 快手视频下载和转发工具
  10. 小米8绑定账号和设备验证失败_网赚项目刚需账号答疑大集合!