2025-04-08 18:46:12 +08:00

96 lines
2.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 程序清单: 这是一个串口设备使用例程
* 例程导出了uart_sample 命令到控制终端
* 命令调用格式: uart_sample uart2
* 命令解释: 命令第二个参数是要使用的串口设备名称, 为空则使用默认的串口设备
* 程序功能: 通过串口输出字符串"hello RT-Thread!" 然后错位输出输入的字符
*/
#include <rtthread.h>
#include "test_config.h"
#include <rtdevice.h>
#ifdef UART_DEMO_TEST
#define SAMPLE_UART_NAME "uart1"
/* 用于接收消息的信号量*/
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;
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);
}
}
static int uart_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
char uart_name[RT_NAME_MAX];
char str[] = "hello BK72xx!\r\n";
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
if (argc == 2)
{
rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
}
else
{
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);
/* 设置配置参数 */
config.baud_rate = BAUD_RATE_115200;
config.data_bits = DATA_BITS_8;
config.stop_bits = STOP_BITS_1;
config.parity = PARITY_NONE;
config.bufsz = 2048; /*can not change buffer size, must be 2048*/
/* 打开设备后才可修改串口配置参数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
rt_device_write(serial, 0, str, (sizeof(str) - 1));
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;
}
/* 导出到msh 命令列表中*/
MSH_CMD_EXPORT(uart_sample, uart device sample);
#endif