2301_77710637 2025-03-14 00:40 采纳率: 50%
浏览 9

为什么蓝牙通过串口给c8t6最小系统板发送数据,OLED屏幕不能实时显示发送的数据



#define BUF_SIZE 64 // 接收缓冲区大小

uint8_t RecvBuf[BUF_SIZE] = {0}; // 接收缓冲区
volatile uint8_t RecvIndex = 0;  // 接收索引
volatile uint8_t RecvFlag = 0;   // 接收完成标志

void Serial_Init(void);
void USART1_IRQHandler(void);
void Display_Data(uint8_t *data, uint16_t len);


void Serial_Init(void)
{
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);    //开启USART1的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //开启GPIOA的时钟
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将PA9引脚初始化为复用推挽输出
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将PA10引脚初始化为上拉输入
    
    /*USART初始化*/
    USART_InitTypeDef USART_InitStructure;                    //定义结构体变量
    USART_InitStructure.USART_BaudRate = 9600;                //波特率
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //硬件流控制,不需要
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;    //模式,发送模式和接收模式均选择
    USART_InitStructure.USART_Parity = USART_Parity_No;        //奇偶校验,不需要
    USART_InitStructure.USART_StopBits = USART_StopBits_1;    //停止位,选择1位
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //字长,选择8位
    USART_Init(USART1, &USART_InitStructure);                //将结构体变量交给USART_Init,配置USART1
    
    /*中断输出配置*/
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);            //开启串口接收数据的中断
    
    /*NVIC中断分组*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);            //配置NVIC为分组2
    
    /*NVIC配置*/
    NVIC_InitTypeDef NVIC_InitStructure;                    //定义结构体变量
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        //选择配置NVIC的USART1线
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //指定NVIC线路使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //指定NVIC线路的抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //指定NVIC线路的响应优先级为1
    NVIC_Init(&NVIC_InitStructure);                            //将结构体变量交给NVIC_Init,配置NVIC外设
    
    /*USART使能*/
    USART_Cmd(USART1, ENABLE);                                //使能USART1,串口开始运行
}



void USART1_IRQHandler(void)
{
    if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
    {
        // 接收到数据
        uint16_t data = USART_ReceiveData(USART1);
        
        // 如果接收缓冲区未满
        if (RecvIndex < BUF_SIZE)
        {
            RecvBuf[RecvIndex++] = data;
        }
        
        // 如果接收到换行符,表示一帧数据接收完成
        if (data == '\n')
        {
            RecvFlag = 1;
        }
        
        USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
    }
}

void Display_Data(uint8_t *data, uint16_t len)
{
  
    OLED_Clear();
    OLED_ShowString(0, 0, "Received Data:",OLED_8X16);
    OLED_ShowString(0, 16, (char *)data,OLED_8X16);
    OLED_Update();    
}



int main(void)
{    
    
    
    
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    OLED_Init();    
    Beep_Init();
    door_Init();
    Store_Init();
    MatrixKey_Init();

        
    Serial_Init(); 


    while (1)
    {    
        
      if (RecvFlag)
        {
          
           
            // 在OLED上显示数据
            Display_Data(RecvBuf, RecvIndex);
            
            // 重置接收标志和索引
            RecvFlag = 0;
            RecvIndex = 0;
        }
   }
}

img

img

img

img

用的jdy–31蓝牙模块,蓝牙的连接和断开就可以实时显示在OLED屏幕上,如果我连续发送了三次:123\n,OLED屏幕一次都不会显示,只有在断开连接的时候,OLED屏幕上才会显示三次123\n,还有那个+DISC:SUCCESS。

这是为什么,哪里出现问题了,有经验丰富的可以解答一下吗,真的烦死了,找不到原因。大二入坑。

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-03-14 00:40
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    用户的问题是,使用蓝牙通过串口将数据发送到C8T6最小系统板,但是OLED屏幕不能实时显示发送的数据。

    解决方案

    1. 检查串口接收数据是否正确 检查 RecvBuf 缓冲区是否正确地接收了数据,如果数据接收错误,可能会导致 OLED 屏幕不能实时显示数据。
    if (uart_recv(uart, RecvBuf, BUF_SIZE) != BUF_SIZE) {
        // 数据接收错误,处理错误
    }
    
    1. 检查 OLED 屏幕是否正确地显示数据 检查 OLED 屏幕是否正确地显示数据,如果 OLED 屏幕显示错误,可能会导致数据不能实时显示。
    // OLED 屏幕显示数据
    oled_write_string(RecvBuf, strlen((char*)RecvBuf));
    
    1. 检查蓝牙发送数据是否正确 检查蓝牙发送数据是否正确,如果蓝牙发送数据错误,可能会导致 OLED 屏幕不能实时显示数据。
    // 发送蓝牙数据
    uart_send(uart, (uint8_t*)data, strlen((char*)data));
    
    1. 检查系统板是否正确地处理数据 检查系统板是否正确地处理数据,如果系统板处理数据错误,可能会导致 OLED 屏幕不能实时显示数据。

    代码示例

    #include <stm32f1xx_hal.h>
    #include <string.h>
    
    #define BUF_SIZE 64 // 接收缓冲区大小
    
    uint8_t RecvBuf[BUF_SIZE] = {0}; // 接收缓冲区
    volatile uint8_t RecvInd = 0; // 接收指针
    
    int main() {
        // 初始化串口
        UART_HandleTypeDef huart = {0};
        huart.Instance = UART1;
        huart.Init.BaudRate = 9600;
        huart.Init.WordLength = UART_WORDLENGTH_8B;
        huart.Init.StopBits = UART_STOPBITS_1;
        huart.Init.Parity = UART_PARITY_NONE;
        HAL_UART_Init(&huart);
    
        // 初始化OLED屏幕
        oled_init();
    
        while (1) {
            // 接收蓝牙数据
            if (uart_recv(uart, RecvBuf, BUF_SIZE) == BUF_SIZE) {
                // 处理接收数据
                process_data(RecvBuf);
            }
        }
    }
    
    void process_data(uint8_t* data) {
        // 处理数据
        // ...
    
        // 发送数据到OLED屏幕
        oled_write_string(data, strlen((char*)data));
    }
    

    结论

    通过检查串口接收数据、OLED 屏幕显示数据、蓝牙发送数据和系统板处理数据,可以解决 OLED 屏幕不能实时显示发送的数据的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月14日