RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)

文章目录

  • 前言
    • RTT的串口设备使用记录,这里我使用的是串口2
  • 一、创建RTT工程
  • 二、选择你所使用的芯片以及调试器
  • 三、创建好的工程
  • 四、打开board.h头文件
  • 五、添加如下宏定义,使用串口2,打开串口2的DMA接收
  • 六、打开RT-Thread Settings
  • 七、点小箭头
  • 八、打开串口DMA模式
  • 九、点击删除再点击保存
  • 十、删除不必要代码
  • 十一、代码如下
  • 十二、编译报错
  • 十三、跳转注释掉即可
  • 十四、再编译无报错
  • 十五、能收能发


前言

RTT的串口设备使用记录,这里我使用的是串口2

一、创建RTT工程

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第1张图片

二、选择你所使用的芯片以及调试器

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第2张图片

三、创建好的工程

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第3张图片

四、打开board.h头文件

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第4张图片

五、添加如下宏定义,使用串口2,打开串口2的DMA接收

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第5张图片

六、打开RT-Thread Settings

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第6张图片

七、点小箭头

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第7张图片

八、打开串口DMA模式

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第8张图片

九、点击删除再点击保存

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第9张图片

十、删除不必要代码

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第10张图片

十一、代码如下

/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-01     RT-Thread    first version
 */

#include 
#include 
#include 

#define SAMPLE_UART_NAME       "uart2"      /* 串口设备名称 */

/* 串口设备句柄 */
static rt_device_t serial;

/* 消息队列控制块 */
static struct rt_messagequeue rx_mq;
/* 串口接收消息结构*/
struct rx_msg
{
    rt_device_t dev;
    rt_size_t size;
};

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    struct rx_msg msg;
    rt_err_t result;
    msg.dev = dev;
    msg.size = size;

    result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
    if ( result == -RT_EFULL)
    {
        /* 消息队列满 */
        rt_kprintf("message queue full!\n");
    }
    return result;
}

static void serial_thread_entry(void *parameter)
{
    struct rx_msg msg;
    rt_err_t result;
    rt_uint32_t rx_length;
    static char rx_buffer[RT_SERIAL_RB_BUFSZ + 1];

    while (1)
    {
        rt_memset(&msg, 0, sizeof(msg));
        /* 从消息队列中读取消息*/
        result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
        if (result > 0)
        {
            /* 从串口读取数据*/
            rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
            rx_buffer[rx_length] = '\0';
            /* 通过串口设备 serial 输出读取到的消息 */
            rt_device_write(serial, 0, rx_buffer, rx_length);
            /* 打印数据 */
            rt_kprintf("%s\n",rx_buffer);
        }
    }
}

int main(void)
{
    rt_err_t ret = RT_EOK;

    char str[] = "hello RT-Thread!\r\n";
    static char msg_pool[256];
    /* 查找串口设备 */
    serial = rt_device_find(SAMPLE_UART_NAME);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", SAMPLE_UART_NAME);
        return RT_ERROR;
    }

    /* 初始化消息队列 */
    rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */
    sizeof(struct rx_msg), /* 一条消息的最大长度 */
    sizeof(msg_pool), /* 存放消息的缓冲区大小 */
    RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */

    /* 以 DMA 接收及轮询发送方式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 发送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));

    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }



    return ret;
}

十二、编译报错

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第11张图片

十三、跳转注释掉即可

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第12张图片

十四、再编译无报错

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第13张图片

十五、能收能发

RT-Thread(RTT)串口设备使用(傻瓜式教程,附源码)_第14张图片

你可能感兴趣的:(RTT,c语言,stm32)