文章摘要: 本文描述了基于rt_thread的串口通信应用示列
硬件平台: 正点原子阿波罗stm32f429开发版
定义数据结构及声明全局变量:
struct serial_msg
{
rt_device_t dev;
rt_size_t size;
char buf[8];
};
static struct rt_messagequeue mq;
static rt_device_t serial;
查找并打开串口设备:
serial = rt_device_find(port_name);
if (!serial)
{
rt_kprintf("find %s failed!\n", port_name);
return RT_ERROR;
}
/// 读写模式,中断读取
ret = rt_device_open(serial,RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
发送数据:
rt_device_write(serial, 0, "HelloWorld\r\n", 12);
接收数据:
static void serial_recv_task(void *args)
{
rt_mq_init(&mq,
"serial_mq",
msg_pool, // 存放消息的缓冲区
sizeof(struct serial_msg), // 一条消息的最大长度
sizeof(msg_pool), // 存放消息的缓冲区大小
RT_IPC_FLAG_FIFO); // 先来先得到的方法分配消息
rt_device_set_rx_indicate(serial, uart_input); /// 设置接收回调函数
while (1)
{
/// 从消息队列中读取消息
ret = rt_mq_recv(&mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
if (ret == RT_EOK)
{
for(i = 0; i < msg.size;i++)
{
rt_kprintf("%c",msg.buf[i]);
}
}
}
}
中断回调函数:
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
struct serial_msg msg;
rt_err_t result;
msg.dev = dev;
while(size > 0)
{
if(size > 8)
{
msg.size = rt_device_read(msg.dev, 0, msg.buf, 8);
size -= 8;
}
else
{
msg.size = rt_device_read(msg.dev, 0, msg.buf, size);
size = 0;
}
result = rt_mq_send(&mq, &msg, sizeof(msg)); /// 发送至消息队列
if (result == -RT_EFULL)
{
///rt_kprintf("message queue full!\n"); ///消息队列满
}
}
}