首页 > 其他分享 >在 STM32 中使用环形队列的方式接收串口数据

在 STM32 中使用环形队列的方式接收串口数据

时间:2024-01-16 16:57:36浏览次数:28  
标签:队列 环形 STM32 RingQueue 串口 data size

在 STM32 中使用环形队列的方式接收串口数据

#include <stdio.h>
#include <stm32f10x.h>
#include <stm32f10x_usart.h>

// 定义环形队列的结构体
typedef struct
{
    uint8_t *buffer; // 数据缓冲区
    uint16_t size; // 缓冲区大小
    uint16_t front; // 队列头索引
    uint16_t rear; // 队列尾索引
} RingQueue;

// 初始化环形队列
void RingQueue_Init(RingQueue *q, uint8_t *buffer, uint16_t size)
{
    q->buffer = buffer;
    q->size = size;
    q->front = q->rear = 0;
}

// 判断环形队列是否为空
bool RingQueue_IsEmpty(RingQueue *q)
{
    return q->front == q->rear;
}

// 判断环形队列是否已满
bool RingQueue_IsFull(RingQueue *q)
{
    return ((q->rear + 1) % q->size == q->front);
}

// 向环形队列中添加数据
void RingQueue_EnQueue(RingQueue *q, uint8_t data)
{
    if (RingQueue_IsFull(q))
    {
        // 队列已满,进行错误处理
        printf("RingQueue is full, cannot enqueue data.\n");
        return;
    }

    q->buffer[q->rear] = data;
    q->rear = (q->rear + 1) % q->size;
}

// 从环形队列中取出数据
uint8_t RingQueue_DeQueue(RingQueue *q)
{
    if (RingQueue_IsEmpty(q))
    {
        // 队列为空,进行错误处理
        printf("RingQueue is empty, cannot dequeue data.\n");
        return 0;
    }

    uint8_t data = q->buffer[q->front];
    q->front = (q->front + 1) % q->size;
    return data;
}

// 串口接收中断处理函数
void USART1_IRQHandler(void)
{
    if (USART1->SR & USART_SR_RXNE)
    {
        RingQueue *q = &串口接收队列;

        // 接收数据
        uint8_t data = USART1->DR;

        // 将数据添加到环形队列
        RingQueue_EnQueue(q, data);
    }
}

int main()
{
    // 初始化串口
    USART1_Init(115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Rx | USART_Mode_Tx);

    // 初始化环形队列
    RingQueue queue;
    RingQueue_Init(&queue, buffer, BUFFER_SIZE);

    // 使能串口接收中断
    USART1->CR1 |= USART_CR1_RXNEIE;

    // 进入主循环,等待数据接收
    while (1)
    {
        if (!RingQueue_IsEmpty(&queue))
        {
            // 从环形队列中取出数据
            uint8_t data = RingQueue_DeQueue(&queue);

            // 处理接收到的数据
            printf("Received data: %c\n", data);
        }
    }

    return 0;
}

标签:队列,环形,STM32,RingQueue,串口,data,size
From: https://www.cnblogs.com/huameixiao/p/17968052

相关文章

  • 《串口篇》串口是什么
    串口是什么?参考链接:https://zhuanlan.zhihu.com/p/626717960?utm_id=0串口:串口是一个泛称,UART、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被称为串口。注意,串口、UART口、COM口、USB口指的是指的是物理接口形式(硬件)。而TTL、RS-232、RS-485指的是电平标准(电信号)。UART......
  • STM32
    STM321、keil的配置以及vscode的配置略2、stm32的命名规则todo以下以stm32lf103ze为例。3、点亮第一个小灯​ 开启时钟、设置输入/输出模式、给小灯的位赋值0。开启时钟开启时钟使用到的寄存器为RCC_APB2ENR,32位,高16位为保留位。第二位IOPA控制IO端口A的输入输出使能......
  • stm32笔记[11]-驱动SSD1306屏幕
    摘要在蓝桥杯物联网的CT127C开发板上驱动SSD1306的0.91寸显示屏.平台信息KeilMDK-ARM(μVision)V5.35.0.0STM32CubeMX6.2.1原理简介CT127C开发板简介蓝桥物联网竞赛实训装置省赛训练套装,适用于蓝桥杯大赛(电子类)物联网设计与开发科目竞赛训练及高校日常教学实训环......
  • STM32学习Day1
    一.所用型号二.STM32上所拥有的外设三.各个引脚的定义(查表)颜色引脚类型蓝色最小相关系统的引脚绿色I/O口和功能口的引脚红色电源相关的引脚类型:①S表示电源②I表示输入③O表示输出I/O口电平:I/O口能容忍的电压FT表示容忍5V,无FT则为3.3V主......
  • 消息队列常见问题及解决方案
    一、如何保证MQ的高可用性——(消息丢失)RabbitMQ镜像模式镜像集群模式是所谓的RabbitMQ的高可用模式,跟普通集群模式不一样的是,你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息......
  • C#结合串口通信类实现串口通信源代码(原创)
    C#结合串口通信类实现串口通信源代码(原创) mycom是串口通信类,在本blog前一篇中有完整代码。( C#串口通信编程类(修改版) )下面是串口通讯测试程序的源代码,将mycom类放在此项目中可以实现简单的串口通信,希望读者能通过这个程序对串口通信过程有一个初步的了解:usingSystem;us......
  • C#串口通信编程类(修改版)
    C#串口通信编程类(修改版) 这是从网上down下来的一个串口通信类,发现close函数忘记了设置Opened属性为false还有后面string转byte[]和byte[]转string的函数有错误,索性删掉了修改后的串口通信类如下:下一篇将把我的测试程序主程序部分全部代码贴出来可以坚强勇敢的用来实现串口......
  • thinkphp 6 消息队列 (转载)
    1.安装think-queuecomposerrequiretopthink/think-queue 2.配置消息队列,将config/queue.php将’default’=>‘sync’改为’default’=>‘redis’,使用Redis驱动 如选择database,需创建表CREATETABLE`prefix_jobs`(`id`int(11)NOTNULLAUTO_INCREMENT,`q......
  • STM32CubeMX教程14 ADC - 多通道DMA转换
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)ST-LINK/V2驱动STM32CubeMX软件(Version6.10.0)keilµVision5IDE(MDK-Arm)CH340GWindows系统驱动程序(CH341SER.EXE)XCOMV2.6串口助手3个滑动变阻器2、实验目标使用STM32CubeMX软件配置STM32F407开发板的ADC实现ADC多......
  • 前K个高频元素 347 暴力法和优先级队列
    关于暴力法简单说一点,我是用链表进行比较排序的,但是有一个细节要注意。点击查看代码structnode{intval;intcount;node*next;node(intval,intcount):val(val),count(count),next(nullptr){}};关于节点的构造函数,一定要构造......