1. 创建项目
a) 禁用Finsh和console
b) 默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1。因此,在运行scons命令生成项目文件之前,修改rtconfig.h,禁用这两项。(下图L65, L70)
c) 生成项目文件
运行scons --target=mdk4 –s
打开生成的项目文件,可以看到,文件组finsh已经不再被包含进来了。
d) 创建echo.c
新建一个C文件echo.c,编写RT_Thread任务入口,COM1侦听,以及初始化函数。示例代码如下:
#include "echo.h" struct rx_msg { rt_device_t dev; rt_size_t size; }; static struct rt_messagequeue rx_mq; static char uart_rx_buffer[64]; static char msg_pool[2048]; // 串口侦听回调函数 rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; msg.dev = dev; msg.size = size; // 将接收内容放入消息队列 rt_mq_send(&rx_mq, &msg, sizeof(struct rx_msg)); return RT_EOK; } // 任务入口函数 void usr_echo_thread_entry(void* parameter) { struct rx_msg msg; rt_device_t device; rt_err_t result = RT_EOK; // 从RT系统中获取串口1设备 device = rt_device_find("uart1"); if (device != RT_NULL) { // 指定接收串口内容的回调函数 rt_device_set_rx_indicate(device, uart_input); // 以读写方式打开设备 rt_device_open(device, RT_DEVICE_OFLAG_RDWR); } while(1) { // 从消息队列中获取被回调函数放入消息队列中的内容 result = rt_mq_recv(&rx_mq, &msg, sizeof(struct rx_msg), 50); if (result == -RT_ETIMEOUT) { // timeout, do nothing } if (result == RT_EOK) { rt_uint32_t rx_length; rx_length = (sizeof(uart_rx_buffer) - 1) > msg.size ? msg.size : sizeof(uart_rx_buffer) - 1; rx_length = rt_device_read(msg.dev, 0, &uart_rx_buffer[0], rx_length); uart_rx_buffer[rx_length] = '