RA生态之串口与printf()函数重定向

本文档详细介绍了如何在E2Studio中配置UART,包括波特率设置、回调函数实现、R_SCI_UART_Write函数使用及printf输出重定向到串口的方法。通过示例代码展示了如何发送和接收数据,并提供了完整的运行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UART 配置:点击 Stacks->New Stack -> Connectivity -> UART Driver on r_sci_uart

改的地方就上面一处,其他地方默认即可,默认串口配置:115200波特率,无校验一停止通道0

R_SCI_UART_Open()函数:开启和初始化 UART

/* Open the transfer instance with initial configuration. */
fsp_err_t err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
assert(FSP_SUCCESS == err);

回调函数 user_uart_callback ():(函数名自定义):相当于串口中断,在这里的案例是接收中断

volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
        if(p_args->event == UART_EVENT_TX_COMPLETE)
        {
                uart_send_complete_flag = true;
        }
}

 R_SCI_UART_Write()函数:进行串口数据输出

unsigned char buff[]="RA E2STUDIO";
uint8_t buff_len = strlen(buff);
err = R_SCI_UART_Write(&g_uart0_ctrl, buff, buff_len);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;

 sprintf()函数:这个应该很多人用过了吧

直接给功能示例了:把格式化的数据写入某个字符串缓冲区

sprintf(send_buff, "\nHello World!.\n");
uint8_t len = strlen(send_buff);
err = R_SCI_UART_Write(&g_uart0_ctrl, send_buff, len);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
memset(send_buff, '\0', sizeof(100));

 printf()函数:

式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。
正在编写步骤时经常会用到此函数

 

 设置 E2STUDIO 堆栈:BSP处设置

(RA-Eco-RA2L1-48PIN-V1.0 设置 heap size
0x2000)
(RA-Eco-RA2E1-48PIN-V1.0 设置 heap size
0x1000)

 

 printf 输出重定向到串口:将 printf 的输出重定向到串口, 然后通过串口将数据发送出去

#ifdef __GNUC__                 //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}
int _write(int fd,char *pBuffer,int size)
{
        for(int i=0;i<size;i++)
        {
        __io_putchar(*pBuffer++);
        }
return size;
}

 printf 输出

int int_i=55;
float float_i=66.20f;
char char_i[]="hello e2studio";
while(1)
{
        printf("int_i=%d\n",int_i);
        printf("float_i=%.2f\n",float_i);
        printf("char_i='%s'\n",char_i);
        R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT100->160
}

 完整例程:

#include "hal_data.h"
#include <stdio.h>
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_err_t err = FSP_SUCCESS;unsigned char send_buff[100];
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
        if(p_args->event == UART_EVENT_TX_COMPLETE)
        {
                uart_send_complete_flag = true;
        }
}
#ifdef __GNUC__                //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}
int _write(int fd,char *pBuffer,int size)
{
        for(int i=0;i<size;i++)
        {
                __io_putchar(*pBuffer++);
        }
        return size;
}
void hal_entry(void)
{
        /* TODO: add your own code here */
        /* Open the transfer instance with initial configuration. */
        err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
        assert(FSP_SUCCESS == err);
        unsigned char buff[]="RA E2STUDIO";
        uint8_t buff_len = strlen(buff);
        err = R_SCI_UART_Write(&g_uart0_ctrl, buff, buff_len);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        sprintf(send_buff, "\nHello World!.\n");
        uint8_t len = strlen(send_buff);
        err = R_SCI_UART_Write(&g_uart0_ctrl, send_buff, len);if(FSP_SUCCESS != err)         __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        memset(send_buff, '\0', sizeof(100));
        int int_i=55;
        float float_i=66.20f;
        char char_i[]="hello e2studio";
        while(1)
        {
                printf("int_i=%d\n",int_i);
                printf("float_i=%.2f\n",float_i);
                printf("char_i='%s'\n",char_i);
                R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
                // NOLINT100->160
        }
        #if BSP_TZ_SECURE_BUILD
        /* Enter non-secure code */
        R_BSP_NonSecureEnter();
        #endif
}

效果演示:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值