串口打印

在上两篇基础上

https://mbb.eet-china.com/forum/topic/131707_1_1.html

https://mbb.eet-china.com/forum/topic/131708_1_1.html

1. 配置串口

1.1. 查原理图

forum.jpg

1.2 查硬件手册

forum.jpg

1.3 配置RASC上的串口

forum.jpg

forum.jpg

2. 代码

2.1 打开串口

forum.jpg


C
    err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
    assert(FSP_SUCCESS == err);

2.2 接收和发送数据处理

forum.jpg

C
#define RING_LEN (255)
char rx_buff[RING_LEN] = {0};
volatile int twrite = 0;
int tread = 0;
/**
* @brief 串口数据回调函数
*
* @param p_args
*/
void uart0_callback(uart_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    if (p_args->event == UART_EVENT_RX_CHAR)
    {
        rx_buff[twrite] = (char)(p_args->data);
        twrite++;
        if (twrite >= RING_LEN)
            twrite = 0;
    }
}
/**
* @brief 从循环buf中获取一个字节
*
* @param ch 输出的字节
* @return int 0:未读到数据,1:读到数据
*/
static int cmd_get_char(char *ch)
{
    if (tread != twrite)
    {
        *ch = rx_buff[tread];
        tread++;
        if(tread >= RING_LEN)
            tread = 0;
        return 1;
    }
    return 0;
}
#define CMD_LEN_MAX (1024)
char buff[CMD_LEN_MAX];
/**
* @brief 打印数据
*
* @param format 格式
* @param ...
*/
void myprintf(const void *format, ...)
{
    int len = 0;
    va_list list;
    va_start(list, format);
    len = vsnprintf(buff, CMD_LEN_MAX, format, list);
    va_end(list);
    if (len > 0)
    {
        R_SCI_UART_Write(&g_uart0_ctrl, (const uint8_t* const) buff, (uint32_t)len);
    }
}

2.3 主循环中处理下

forum.jpg

C
        if (cmd_get_char(&cmd))
        {
            myprintf("cmd:%c\r\n",cmd);
        }