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个字符。
当输入第十个的时候,直接执行打印操作。