RT-Thread Stduio 增加一个串口3

1、在board.h中添加串口3

2、测试代码 正点原子精英版

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

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */
#define LED0_PIN    GET_PIN(B, 5)

#define SAMPLE_UART_NAME "uart3"
/* 用 于 接 收 消 息 的 信 号 量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;
/* 接 收 数 据 回 调 函 数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/* 串 口 接 收 到 数 据 后 产 生 中 断, 调 用 此 回 调 函 数, 然 后 发 送 接 收 信 号 量 */
    rt_sem_release(&rx_sem);
    return RT_EOK;
}
static void serial_thread_entry(void *parameter)
{
    char ch='a';
    while (1)
    {
    /* 从 串 口 读 取 一 个 字 节 的 数 据, 没 有 读 取 到 则 等 待 接 收 信 号 量 */
        while (rt_device_read(serial, -1, &ch, 1) != 1)
        {
        /* 阻 塞 等 待 接 收 信 号 量, 等 到 信 号 量 后 再 次 读 取 数 据 */
        rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
        }
        /* 读 取 到 的 数 据 通 过 串 口 错 位 输 出 */
       // ch = ch + 1;
        rt_device_write(serial, 0, &ch, 1);
       // rt_thread_sleep(100);
    }
}
static int uart_sample()
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX] ;
    char str[] = "hello RT-Thread!\r\n";

    rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);

    /* 查 找 系 统 中 的 串 口 设 备 */
    serial = rt_device_find(uart_name);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }
    /* 初 始 化 信 号 量 */
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_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;
}

int main(void)
{
    int count = 1;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    uart_sample();
    while (count++)
    {
        /* set LED0 pin level to high or low */
        rt_pin_write(LED0_PIN, count % 2);
        LOG_D("Hello RT-Thread!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}
发布了136 篇原创文章 · 获赞 22 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/103968472