博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
串口实现FIFO接受数据(V2)
阅读量:5222 次
发布时间:2019-06-14

本文共 7322 字,大约阅读时间需要 24 分钟。

在上一次的基础上添加了不同需求缓冲区大小可变的更改。

1 /*  2 * 串口的FIFO简单读取实现  3 * 功能,实现串口的FIFO实现  4 * 使用方法:  5 * 更新时间:2017.9.26  6 * 版本:v2.0.0  7 * 编写:ZhangPeng  8 */  9 #include "stdio.h" 10 #include 
11 #include "df_fifo.h" 12 #include
13 /* 14 * 函数功能:Fifo出队操作 15 * 入口参数 16 参数1:缓冲区句柄 17 参数2:要出队的指针地址 18 参数3:出队的个数 19 * 出口参数:是否出队成功 20 * 注意事项:该函数只从头指针开始读取,length个字节,不会影响缓冲区数据 21 */ 22 Df_StateTypeDef Df_FifoOutput(Df_FifoPointTypeDef kfifo, uint8_t * buf, uint8_t length) 23 { 24 Df_FifoStructTypeDef Pfifo; 25 Pfifo = *kfifo; 26 if (Pfifo.Count - length < 0)//缓冲区没有足够的数据 27 { 28 return Df_StateOutOver;//读数据越界 29 } 30 while (length--) 31 { 32 *buf = Pfifo.buffer[Pfifo.read]; 33 buf++; 34 Pfifo.read++;//读取指针自加 35 if (Pfifo.read == Pfifo.length) 36 { 37 Pfifo.read = 0; 38 } 39 } 40 return Df_StateOk;//数据读取成功 41 } 42 43 /* 44 * 函数功能:Fifo入队操作 45 * 入口参数 46 参数1:缓冲区句柄 47 参数2:要入队的指针地址 48 参数3:入队的个数 49 * 出口参数:是否入队成功 50 * 注意事项:该函数在缓冲区满的时候会返回Over 51 */ 52 Df_StateTypeDef Df_FifoInput(Df_FifoPointTypeDef Pfifo, uint8_t * buf, uint8_t length)// 53 { 54 if (Pfifo->Count + length > Pfifo->length)//写入的数据超过缓冲区 55 { 56 return Df_StateInOver;//写数据越界 57 } 58 while (length--) 59 { 60 Pfifo->buffer[Pfifo->write] = *buf;//赋值给缓冲区 61 buf++;//缓冲区地址加一 62 Pfifo->Count++; 63 Pfifo->write++;// 64 if (Pfifo->write == Pfifo->length) 65 { 66 Pfifo->write = 0; 67 } 68 } 69 return Df_StateOk;//数据读取成功 70 } 71 72 /* 73 * 函数功能:缓冲区擦除操作 74 * 入口参数 75 参数1:缓冲区句柄 76 参数2:擦除的数据长度 77 * 出口参数:是否擦除 78 * 注意事项:该函数会将缓冲区头开始的length个数据从缓冲区擦除 79 */ 80 Df_StateTypeDef Df_FifoErase(Df_FifoPointTypeDef Pfifo, uint8_t length)// 81 { 82 if (Pfifo->Count - length > Pfifo->length)//写入的数据超过缓冲区 83 { 84 return Df_StateEaserOver;//写数据越界 85 } 86 while (length--) 87 { 88 Pfifo->Count--; 89 Pfifo->read++;// 90 if (Pfifo->read == Pfifo->length) 91 { 92 Pfifo->read = 0; 93 } 94 } 95 return Df_StateOk;//数据读取成功 96 } 97 98 /* 99 * 函数功能:重置缓冲区100 * 入口参数101 参数1:缓冲区句柄102 参数2:缓冲区数组首地址103 参数3:缓冲区的大小104 * 出口参数:是否重置成功105 * 注意事项:length不能小于buf 的长度否则会导致内存泄漏106 */107 Df_StateTypeDef Df_FifoReset(Df_FifoPointTypeDef Pfifo,uint8_t * buf,uint16_t length)108 {109 printf("[%s]the buffer length is %d\n", __FUNCTION__, sizeof(buf));110 Pfifo->buffer = buf;//缓冲区数组111 Pfifo->length = length;//缓冲区大小112 Pfifo->Count = 0;//数据为空113 Pfifo->read = 0;//读指针为0114 Pfifo->write = 0;//写指针为0115 return Df_StateOk;116 }117 118 /*119 * 函数功能:Fifo出队操作120 * 入口参数121 参数1:缓冲区句柄122 参数2:要出队的指针地址123 参数3:出队的个数124 * 出口参数:是否出队成功125 * 注意事项:该函数只从头指针开始读取,length个字节,同时擦除该部分数据126 */127 Df_StateTypeDef Df_FifoOutEaser(Df_FifoPointTypeDef Pfifo, uint8_t * buf, uint8_t length)128 {129 if (Pfifo->Count - length < 0)//缓冲区没有足够的数据130 {131 return Df_StateOutOver;//读数据越界132 }133 while (length--)134 {135 *buf = Pfifo->buffer[Pfifo->read];136 buf++;137 Pfifo->Count--;138 Pfifo->read++;//读取指针自加139 if (Pfifo->read == Pfifo->length)140 {141 Pfifo->read = 0;142 }143 }144 return Df_StateOk;//数据读取成功145 }146 #define debug 1//是否打印缓冲区状态147 /*测试*/148 int main()149 {150 Df_FifoStructTypeDef Fifostructdefine;151 uint8_t buffer[100];//定义缓冲区152 memset(buffer, 0, 100 * sizeof(uint8_t));//初始化缓冲区153 uint8_t data[100];//定义应用数组154 uint8_t test[100];//155 memset(test, 0, 100*sizeof(uint8_t));156 for (int i = 0; i < 100; i++)157 data[i] = i;158 Df_FifoReset(&Fifostructdefine, buffer, 100);//初始化缓冲区结构159 #if debug160 printf("The buffer count is %d\n", Fifostructdefine.Count);161 printf("The buffer length is %d\n", Fifostructdefine.length);162 printf("The buffer Pread is %d\n", Fifostructdefine.read);163 printf("The buffer Pwrite is %d\n", Fifostructdefine.write);164 #endif // debug165 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>写入测试<<<<<<<<<<<<<<<<<<<<<<<\n");166 Df_FifoInput(&Fifostructdefine, data, 100);167 #if debug168 printf("The buffer count is %d\n", Fifostructdefine.Count);169 printf("The buffer length is %d\n", Fifostructdefine.length);170 printf("The buffer Pread is %d\n", Fifostructdefine.read);171 printf("The buffer Pwrite is %d\n", Fifostructdefine.write);172 #endif // debug173 /*直接读取测试*/174 printf(">>>>>>>>>>>>>>>>>>>>>>>>>直接读取测试<<<<<<<<<<<<<<<<<<<<<<<\n");175 Df_FifoOutput(&Fifostructdefine, &test, 50);176 for (int i = 1;i <51;i++)177 {178 printf("test[%d] = %d\t", i-1, test[i-1]);179 if (i % 5 == 0)180 {181 printf("\n");182 }183 }184 #if debug185 printf("The buffer count is %d\n", Fifostructdefine.Count);186 printf("The buffer length is %d\n", Fifostructdefine.length);187 printf("The buffer Pread is %d\n", Fifostructdefine.read);188 printf("The buffer Pwrite is %d\n", Fifostructdefine.write);189 #endif // debug190 /*擦除测试*/191 printf(">>>>>>>>>>>>>>>>>>>>>擦除测试<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");192 Df_FifoErase(&Fifostructdefine, 30);193 #if debug194 printf("The buffer count is %d\n", Fifostructdefine.Count);195 printf("The buffer length is %d\n", Fifostructdefine.length);196 printf("The buffer Pread is %d\n", Fifostructdefine.read);197 printf("The buffer Pwrite is %d\n", Fifostructdefine.write);198 #endif // debug199 /*读取擦除测试*/200 printf(">>>>>>>>>>>>>>>>>>>>>读取擦除测试<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");201 while (Df_FifoOutEaser(&Fifostructdefine,&data[0],1) == Df_StateOk)202 {203 printf("Df_FifoOutEaser data is %d\n", data[0]);204 }205 #if debug206 printf("The buffer count is %d\n", Fifostructdefine.Count);207 printf("The buffer length is %d\n", Fifostructdefine.length);208 printf("The buffer Pread is %d\n", Fifostructdefine.read);209 printf("The buffer Pwrite is %d\n", Fifostructdefine.write);210 #endif // debug211 system("pause");212 }

 

.h文件

1 #ifndef  _DF_FIFO_H 2 #define  _DF_FIFO_H 3 #define uint8_t unsigned char 4 #define uint16_t unsigned int  5 /*该参数设置接受区大小*/ 6  7 typedef struct { 8      9     int  read;//读指针10     int  write;//写指针11     int  Count;//缓冲区计数12     int  length;//缓冲区大小13     uint8_t  * buffer;// [RECERIVRSIZE];//接受缓冲区14 }Df_FifoStructTypeDef, *Df_FifoPointTypeDef;15 16 17 typedef enum Df_StateTypeDef18 {19     Df_StateOk,//成功20     Df_StateErr,//失败21     Df_StateTimeout,//超时22     Df_StateOutOver,//读溢出23     Df_StateInOver,//写溢出24     Df_StateEaserOver//擦除溢出25 }Df_StateTypeDef;26 27 28 Df_StateTypeDef Df_FifoInput(Df_FifoPointTypeDef Pfifo, uint8_t * buf, uint8_t length);29 Df_StateTypeDef Df_FifoOutput(Df_FifoPointTypeDef Pfifo, uint8_t * buf, uint8_t length);30 Df_StateTypeDef Df_FifoErase(Df_FifoPointTypeDef Pfifo, uint8_t length);31 Df_StateTypeDef Df_FifoReset(Df_FifoPointTypeDef Pfifo, uint8_t * buf, uint16_t length);32 33 34 #endif /*_DF_FIFO_H*/

 该版本同样的使用静态队列实现,添加了擦除输出函数,只输出不删除函数,和删除函数,静态队列长度根据不同的应用可以自定义

转载于:https://www.cnblogs.com/memorypro/p/7598193.html

你可能感兴趣的文章
前端开发就从认识浏览器开始 - 浏览器处理请求的过程
查看>>
【练习】使用事务和锁定语句
查看>>
centos7升级firefox的flash插件
查看>>
jmeter系列二(jmeter engine相关)
查看>>
前端页面设计问题小计
查看>>
一份超全超详细的 ADB 用法大全
查看>>
Spring定时任务(@Scheduled)
查看>>
WebView 调试
查看>>
IB使用
查看>>
Linux硬链接和软链接(符号链接)
查看>>
git stash
查看>>
Apache Common-IO 使用
查看>>
Java-第一课正则表达式
查看>>
深入剖析,什么是eval的直接调用.
查看>>
apidoc
查看>>
3月14日-15日学习总结
查看>>
关于 ++x 和 x++ 比较难的一个例子
查看>>
第三次作业 105032014021
查看>>
记录一些容易忘记的属性 -- UILabel
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>