本文主要记录基于
RT-Thread
的串口接收数据,并找出完成的一帧报文
实现:
- 完整的一帧数据发送出去,提示【找到一帧数据】
- 不完整的一帧数据发出去,不做解析,2s后未收到数据,清空缓冲区
- 单个字节接收的时间间隔定义为2s,间隔 2s 未收到数据,默认清空缓冲区
【测试结果】
目录
- 0. 个人简介 && 授权须知
- 1. 数据传输流程
- 2. 自定义串口数据协议
- 3. rt-thread 代码
- 4. 测试结果
0. 个人简介 && 授权须知
📋 个人简介
- 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
- 📝 个人主页:欢迎访问我的博客主页🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:嵌入式开发专栏 🍁 🍁
- 💬格言:写文档啊不是写文章,重要的还是直白!🔥
转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者
若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。作者:积跬步、至千里
1. 数据传输流程
2. 自定义串口数据协议
固定帧头:0x55 0x88
结束符: '\r\n'
3. rt-thread 代码
/************************************************************************************************************
* Copyright (c) 2024,xxxxxxxxxx公司
*
* 描 述:
*
* 修改记录:
* 日期 作者 备注
* 2023-07-11 zyh 首次创建,实现串口的中断接收
************************************************************************************************************/
#include <rtthread.h>
#include <string.h>
#include <stdio.h>
#include <rtdevice.h>
/* 串口设备名称 */
#define UART2_DEV_NAME "uart2"
/*缓冲区大小*/
#define RB_SIZE 256
#define TASK_UART2_THREAD_TICK 20
#define TASK_UART2_THREAD_STACK_SIZE 2048
#define TASK_UART2_THREAD_PRIORITY 5
/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem2;
static rt_device_t serial2;
static uint8_t uart2_init_flag = 0;
static uint8_t rb_buf_for_uart2[RB_SIZE];
static int16_t timeout = 2000; // ms
#define FRAME_START_BYTE (0x5588) // 定义帧首字节
#define FRAME_END_BYTE (0x0a) // 定义帧尾字节 '\n'
typedef enum {
STATE_SEARCH_START, // 帧头
STATE_READING_DATA,
STATE_FOUND_END // 结束符