前言
UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。本文使用RT_Thread通用 I/O 设备管理接口来访问串口硬件,从W600 UART1中读取数据,并原样返回。
一、API简介
RT_Thread支持设备API函数如下表所示:
API详细说明,请参考RT_Thread官方文档中心串口设备描述,地址如下:https://www.rt-thread.org/document/site/
二、使用实例
1.环境配置
使用ENV工具配置串口资源,选择Hardware Drivers Config
选择on-chip Peripheral Drivers --->
查看默认已经打开了串口1(PB11:RX, PB12:TX)
2.中断接收并发送
#include <rtthread.h>
#include <rtdevice.h>
// 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
rt_device_t user_uart;
static rt_err_t user_uart_input(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&rx_sem);
return RT_EOK;
}
static void user_uart_thread_entry(void *args)
{
char ch;
while (1)
{
while (1 != rt_device_read(user_uart, -1, &ch, 1))
{
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
//send back
rt_device_write(user_uart, 0, &ch, 1);
}
}
int main(void)
{
rt_err_t ret = RT_EOK;
char str[] = "hello world!\r\n";
user_uart = rt_device_find("uart1");
if (!user_uart)
{
rt_kprintf("find uart1 failed!\r\n");
return RT_ERROR;
}
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
rt_device_open(user_uart, RT_DEVICE_FLAG_INT_RX);
rt_device_set_rx_indicate(user_uart, user_uart_input);
rt_device_write(user_uart, 0, str, sizeof(str) - 1);
rt_thread_t uart_thread = rt_thread_create("user_uart", user_uart_thread_entry, RT_NULL, 1024, 25, 10);
if (uart_thread != NULL)
{
rt_thread_startup(uart_thread);
}else
{
ret = RT_ERROR;
}
return ret;
}
三、下载运行
在ENV控制台,输入scons命令,在build/Bin目录下生成rtthread_1M.FLS,烧录运行后,将模块PB12连接串口小板的RX,PB11连接串口小板的TX,共地。
上电后,模块会向串口小板发送hello world!,然后通过串口工具发送hello RT_Thread,模块收到串口工具发送信息后,会自动返回。
四、结语
本节完,如您在使用过程中有任何问题,请加QQ群进一步交流
QQ交流群:906015840 (备注:物联网项目交流)
资料获取:关注公众号:一个物联网项目的前世今生,回复w600即可
一叶孤沙出品:一沙一世界,一叶一菩提