一、关于串口以队列方式接收数据应用笔记。

2023-05-16

一、关于队列文件的处理如下
头文件

#ifndef _FIFO_H_
#define _FIFO_H_


typedef struct fifo_t {
    uint8_t *buf;//缓存区
	uint32_t size;//队列大小
	uint32_t in;//入读计数
	uint32_t out;//出队计数
} _fifo_str;

#define min(x,y) ((x) < (y)?(x):(y))

int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size);//初始化

int FifoDataLen(void);//获取当前时刻里队列的数据长度

int FifoSpaceLen(void);//获取队列剩余空间长度

int FifoRead(uint8_t *buf, uint32_t len);//读队列数据

int FifoWrite(uint8_t *buf, uint32_t len);//写队列数据

void FifoClear(void);//清除队列的计数标志


#endif

c文件

#include "fifo.h"
#include "string.h"

_fifo_str fifo_str;

int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size)//初始化
{
	_fifo_str *p = &fifo_str;
	
	if(fifo_addr == NULL || fifo_size == 0)
		return -1;

	memset((char *)p, 0, sizeof(_fifo_str));
	p->buf = fifo_addr;
    p->in = 0;
    p->out = 0;
    p->size = fifo_size;
	return 0;
}

int FifoDataLen(void)
{
	_fifo_str *p = &fifo_str;
	
	return (p->in - p->out);//获取当前队列中剩余缓存区的未被读取的数据长度
}

int FifoSpaceLen(void)
{
	_fifo_str *p = &fifo_str;
	
	return (p->size - (p->in - p->out));//获取当前队列中剩余没有数据的长度
}

int FifoRead(uint8_t *buf, uint32_t len)
{
	uint32_t i = 0, j = 0;
	_fifo_str *p = &fifo_str;

	j = (p->out % p->size);
	len = min(len, p->in - p->out);
	i = min(len, p->size - j);//判断出队的数据长度的取舍。
	memcpy(buf, p->buf + j, i);
	memcpy(buf + i, p->buf, len - i);//拷贝要读取的数据到队列的缓存区。
	p->out += len;//对读取的数据进行出队计数
	return len;
}

int FifoWrite(uint8_t *buf, uint32_t len)//写数据到队列中
{
	uint32_t i = 0, j = 0;
	_fifo_str *p = &fifo_str;

	j = p->in % p->size;
	len = min(len, p->size - p->in + p->out);
	i = min(len, p->size - j);//判断入队的数据长度的取舍。
	memcpy(p->buf + j, buf, i);
	memcpy(p->buf, buf + i, len - i);//拷贝要写入的数据到队列的缓存区。
	p->in += len;//对写入的数据进行入队计数

	return len;
}

void FifoClear(void)//清理入队和出队计数
{
	_fifo_str *p = &fifo_str;
	
    p->in = 0;
    p->out = 0;
}

二、关于如何使用调用

1、在回调函数中调用
(1)、当接收的数据不确定长度时
if (FifoSpaceLen() >= huart->RxXferCount)//判断接收的数据是否超出队列的剩余空间
	{
		FifoWrite(huart->pRxBuffPtr, huart->RxXferCount);//写入当前串口接收到的数据到队列中
	}2)、当接收的数据确定长度。

	FifoWrite(串口接收的数据, 当前要从串口接收的数据长度);


2、在main主函数中调用

	初始化	FifoInit(pdata, LEN);
	读取队列中的数据
		len = FifoDataLen();//获取队列中数据长度
		if (len > 0)//判断数据长度是否大于0
		{
			FifoRead(buf, tx_len);//读取队列中的数据到buf中,此时buf中就缓存着串口接收到数据。
		}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一、关于串口以队列方式接收数据应用笔记。 的相关文章

  • python PyQt5使用QT designer不显示问题

    初学Pyqt5记录走过 的坑 xff01 1 窗口自适应 xff1a 窗口自适应我的理解就是使用栅格布局 xff0c 调整后会根据窗口大小调整比例 先把自己需要的截面放在UI上 xff0c 然后使用栅格布局即按Ctrl 43 r即可预览 x
  • opencv跑yolo报错Failed to parse NetParameter file

    64 TOC cv2 error OpenCV 3 4 5 opencv 3 4 5 modules dnn src darknet darknet importer cpp 214 error 212 Parsing error Fail
  • Java自学

    JAVA自学 一 需要掌握的知识点二 资源中心 教程 练习 三 工作要求 图片 一 需要掌握的知识点 java基础 xff08 多线程 IO xff08 nio xff0c bio xff0c aio xff09 xff09 各种数据结构
  • python解析DataMatrix Code二维码

    span class token comment 安装 span span class token triple quoted string string 39 39 39 sudo apt get install libdmtx0a pi
  • SpringBoot中使用自定义异常Exception

    记录一下SpringBoot中使用自定义异常操作方法 代码如下 创建ServiceException class span class token keyword public span span class token keyword c
  • kafka的安装与使用(一)

    kafka的安装与使用 xff08 一 xff09 最近接触消息中间件 xff0c 把使用过程中记录一下 xff01 1 下载与安装 任何文档都要以官方文档为准 xff0c 英文多看两眼你会发现比上次更加熟悉了 xffe3 xffe3 xf
  • 【GITEE】解决 Push rejected

    问题背景 xff1a 更新了台式电脑后 xff0c 从gitlee上拉了代码 xff0c 重新push后就一直报错 xff1a Push single to origin single was rejected by remote 问题解决
  • 一小时学会Python3爬虫基础(二)基础语法 输入输出 关键字 注释

    目录 前言集成环境 编辑器基本语法缩进换行标识符关键字注释输入 输出总结 前言 python作为一门编程语言 xff0c 也跟其他语言一样有自己的逻辑语法 xff0c 那什么是语法 xff1f 跟人一样每个人都有自己说话一套方法 集成环境
  • windows 生成self-sign证书

    打开powershell 管理员身份运行 New SelfSignedCertificate CertStoreLocation Cert LocalMachine My DnsName 34 mysite local 34 Friendl
  • 一小时学会Python3爬虫基础(四)完整解析格式化输出和数据类型转换

    目录 前言格式化输出格式化符号 s格式化函数format格式化表示 f string 转义符和结束符 n意思就是 换行 new line t 叫做水平制表符 tab xff0c r 是回车符carriage return结束符 数据类型转换
  • 一小时学会Python3爬虫基础(七)高级数据的全部操作:字典

    目录 前言字典1 字典格式2 创建有效字典2 创建空字典3 字典类型转换 字典增加和修改1 增加2 修改 字典查找1 key键查找2 get 3 keys 4 values 5 items 字典循环遍历1 遍历字典的key值2 遍历字典的v
  • Python处理异常代码的基本操作,原来都大同小异!

    目录 什么是异常 xff1f 如何捕获异常 xff1f 1 异常的写法2 捕获指定异常3 捕获多个异常4 捕获异常的描述5 捕获所有异常6 异常的else7 finally8 自定义异常模块9 异常传递思路 总结 什么是异常 xff1f 简
  • python的模块与包的关系

    模块和包的概念 python中的模块 xff0c 其实就是一个python的文件 xff0c 包含了很多类和函数 xff0c 基本上都是可以向外调用的 xff0c 或者整个文件都用来处理某个操作 xff0c 我们使用库和框架就是由模块和包构
  • 一小时学会Python基础练习的十四个练手题

    目录 1到100的加法搬家具办公室人员分配猜拳游戏乘公交车吃苹果九九乘法表烤地瓜奇偶100内相加三角形正方形文件备份学员管理系统 xff08 函数版 xff09 学员管理系统 xff08 面向对象版 xff09 mainmangerSyst
  • ROS Topic (话题通信总结)

    拿到一个功能包 xff0c 先运行一下 xff08 以turtlesim为例子 xff09 xff1a rusrun turtlesim turtlesim node 然后使用 rqt graph 和rostopic list 大致了解有哪
  • vector函数用法

    一维 基本用法 xff1a 1 头文件 include lt vector gt 2 创建vector对象 xff0c vector lt int gt vec 3 尾部插入数字 xff1a vec push back a 4 使用下标访问
  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • Python中[-1]、[:-1]、[::-1]、[n::-1]、[:,:,0]、[…,0]、[…,::-1] 的理解

    在python中会出现 1 1 1 n 1 0 0 1 xff0c 他们分别是什么意思呢 xff0c 这里就来详尽的说一下 xff1a 下面的a 61 1 2 3 4 5 1 xff1a 列表最后一项 1 xff1a 从第一项到最后一项 原
  • 贴片电阻字码阻值对照表

  • 使用sphinx生成python项目文档

    1 pip install sphinx 2 sphinx quickstart 3 修改 conf py import os import sys sys path insert 0 os path abspath 39 39 确保mod

随机推荐