Bootstrap

e2studio开发RA2E1(13)----串口接收数据

概述

串口通信(UART)是一种常用的异步数据传输方式,在嵌入式系统中广泛应用于设备之间的数据交互。本文主要探讨如何通过串口接收数据,包括初始化配置、数据接收流程、常见问题处理以及实现串口数据接收的实际代码示例。本博客旨在帮助开发者快速掌握串口接收的基础知识与技巧,从而在实际项目中灵活应用。

最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。

在这里插入图片描述

视频教学

样品申请

https://www.wjx.top/vm/rCrkUrz.aspx

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA2E1A72DFL#AA0

在这里插入图片描述

参考程序

https://github.com/CoreMaker-lab/RA2E1

https://gitee.com/CoreMaker/RA2E1

源码下载

R_SCI_UART_Read()函数

R_SCI_UART_Read() 的功能是从指定的 UART 控制块中读取用户指定数量的字节到目标缓冲区中。

在这里插入图片描述

接收用户指定数量的字节并存储到目标缓冲区中,实现 UART 数据的读取操作。 故可以用 R_UARTA_Read()函数进行获取固定长度的数据。

    uint8_t  TRANSFER_LENGTH=10;
    uint8_t  g_dest[TRANSFER_LENGTH];
    R_SCI_UART_Read(&g_uart9_ctrl, g_dest, TRANSFER_LENGTH);

UART_EVENT_RX_COMPLETE

UART_EVENT_RX_COMPLETE:接收完成事件,当一帧数据接收完整后触发。

UART 回调函数,用于处理 UART 事件,包括发送完成事件 (UART_EVENT_TX_COMPLETE) 和接收完成事件 (UART_EVENT_RX_COMPLETE)。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
volatile bool g_receive_complete  = false;
void user_uart_callback (uart_callback_args_t * p_args)
{

    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
    else if(p_args->event == UART_EVENT_RX_COMPLETE)
    {
        g_receive_complete  = true;
    }


}

主函数添加如下。

    while(1)
    {
       if(g_receive_complete==1)
       {
           g_receive_complete=0;
           err = R_SCI_UART_Write(&g_uart9_ctrl, g_dest, TRANSFER_LENGTH);
           if(FSP_SUCCESS != err) __BKPT();
               while(uart_send_complete_flag == false){}
       }
        R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); //
    }        

演示结果如下所示。

在这里插入图片描述

UART_EVENT_RX_CHAR

UART_EVENT_RX_CHAR:字符接收事件,当接收到一个字符时触发。

在这里插入图片描述
UART_EVENT_RX_CHAR 是 UART 模块中定义的一个事件,它的作用是用于处理单个字符接收完成的情况。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
volatile bool g_receive_complete  = false;
#define TRANSFER_LENGTH_1  10
uint8_t  g_out_of_band_received[TRANSFER_LENGTH_1];
uint32_t g_out_of_band_index = 0;
void user_uart_callback (uart_callback_args_t * p_args)
{

    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
    else if(p_args->event == UART_EVENT_RX_COMPLETE)
    {
        g_receive_complete  = true;
    }
    else if(p_args->event == UART_EVENT_RX_CHAR)
    {
        /* Only put the next character in the receive buffer if there is space for it */
        if (sizeof(g_out_of_band_received) > g_out_of_band_index)
        {
            /* Write either the next one or two bytes depending on the receive data size */
            if (UART_DATA_BITS_8 >= g_uart9_cfg.data_bits)
            {
                g_out_of_band_received[g_out_of_band_index++] = (uint8_t) p_args->data;
                }
            else
            {
                uint16_t * p_dest = (uint16_t *) &g_out_of_band_received[g_out_of_band_index];
                *p_dest              = (uint16_t) p_args->data;
                g_out_of_band_index += 2;
                 }
        }

    }

}

主程序做如下修改,串口读取关闭。

//    uint8_t  TRANSFER_LENGTH=10;
//    uint8_t  g_dest[TRANSFER_LENGTH];
//    R_UARTA_Read(&g_uart0_ctrl, g_dest, TRANSFER_LENGTH);

while中添加读取10个长度数据进行打印。

    while(1)
    {
//        if(g_receive_complete==1)
//        {
//            g_receive_complete=0;
//            err = R_SCI_UART_Write(&g_uart9_ctrl, g_dest, TRANSFER_LENGTH);
//            if(FSP_SUCCESS != err) __BKPT();
//                while(uart_send_complete_flag == false){}
//        }
        if(g_out_of_band_index==10)
        {
            g_out_of_band_index=0;
            err = R_SCI_UART_Write(&g_uart9_ctrl, g_out_of_band_received, TRANSFER_LENGTH_1);
            if(FSP_SUCCESS != err) __BKPT();
                while(uart_send_complete_flag == false){}
        }


         R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); //
    }

输入5个数据,可以实时查看到数据。

在这里插入图片描述

输入4个字符。

在这里插入图片描述

当输入第十个的时候,直接执行打印操作。

在这里插入图片描述

;