【RT-Thread】串口接收数据并找出一帧完整的报文

发布于:2024-07-31 ⋅ 阅读:(94) ⋅ 点赞:(0)

本文主要记录基于 RT-Thread的串口接收数据,并找出完成的一帧报文
实现:

  • 完整的一帧数据发送出去,提示【找到一帧数据】
  • 不完整的一帧数据发出去,不做解析,2s后未收到数据,清空缓冲区
  • 单个字节接收的时间间隔定义为2s,间隔 2s 未收到数据,默认清空缓冲区

【测试结果】
在这里插入图片描述

0. 个人简介 && 授权须知

image-20230911133730620

📋 个人简介

  • 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
  • 📝 个人主页:欢迎访问我的博客主页🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:嵌入式开发专栏 🍁 🍁
  • 💬格言:写文档啊不是写文章,重要的还是直白!🔥

转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者

若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:积跬步、至千里

image-20230911133724204

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			// 结束符

网站公告

今日签到

点亮在社区的每一天
去签到