串口接收不定长数据

news2024/11/20 1:38:51

使用串口进行数据的收发在嵌入式产品中是很常用的一种通信方式,因为串口的简单使用,很容易就被选为产品中数据交互的通信手段。

基于串口进行开发的功能有很多,比如同类/不同类产品之间的通信,RS485通信,RS232通信方式,实现串口命令行终端用于调试等等的。虽然应用的场景有所不同,但是都会涉及到一个共同的问题:怎么确保收到一帧完整的数据?

使用过串口的朋友都会知道,串口收发数据都是按照串行的方式进行的,数据是按照bit的方式一位一位进行发送的。而且发送数据方想要发送的数据长度不一定是固定的,有可能长有可能短,这就会涉及到怎么识别一帧数据已经被接收完了的问题。

1.  串口数据的发送和接收方式

串口的接收和发送在两个设备之间是按照bit的方式进行通信的,参见下面的示意图:

图片

数据从一方按照bit的方式1bit进行传输,另外一方也是按照1bit的方式进行接收,直到接收完1Byte数据为止,然后再接收下一个1Byte的数据。

这里还需要考虑另外一个问题,就是一个字节数据之间的时间间隔。简单而言就是接收第一个字节和第二个字节之间的时间间隔,这个时间间隔在大数据量的情况下是要考虑的,数据量少的情况下可以忽略不计。参见下面的示意图:

图片

2.  串口接收不定长数据的实现方式

对于串口接收数据,最需要考虑的是怎么确保收到一帧完整的数据。因为在很多场景下都会遇到的一个问题,就是串口发送的数据是长度不固定的,有时候长有时候短,这就给接收数据和识别数据是有效的带来了一些难度。

下面根据我个人在项目中使用串口进行数据接收的时候,针对不定长数据的处理方式进行简单的分享。

2.1、固定格式帧的不定长数据接收

这种数据一般都是应用在某些产品之间的通信协议,有固定的数据帧格式,比如有固定的帧头和帧尾用于确定数据帧,如下的固定帧头尾的各式:

#define CMD_HEAD 0XAA5A //帧头#define CMD_TAIL 0XFDFCFF //帧尾

这种方式接收数据的时候就比较简单,可以在接收数据的时候进行判断,遇到帧头的时候就开始保存数据,在识别到帧尾之后完成一帧数据的接收,再用其他的手段将这帧数据进行解析。

或者也可以先将所有的数据先接收起来,比如用一个数据缓冲区先保存所有的数据,然后再由应用程序去解析。因为这种数据是有固定格式的,所以解析的时候也很方便,只要按照数据帧的格式进行判别,如果符合格式的定义,就可以认为是一帧完整的数据,否者就丢弃。

2.2、格式不固定长度也不固定的数据的接收

这种数据的接收就相对比较麻烦一点,因为格式不是固定的,没有明确的标识数据帧开头和结尾的特征数据,所以这种方式的数据接收往往考虑的是数据帧之间的间隔,根据两帧数据之间的间隔进行判断,设置一个时间间隔,如果符合这个时间间隔就认为数据的接收是有效的,否者认为无效。

这种方式需要用到一个计时,并设定一个帧之间的时间间隔,从接收到数据就开始计时,然后每收一个数据就重置这个计时,直到计时到达设置的帧间隔时间没有再接收到数据则认为数据已经接收完成。

这个帧的时间间隔可以任意设置,一般我们考虑是3.5个字符的时间。如果3.5个字符的时间没有再收到数据,就认为数据的传输已经完成,接收端已经完成了数据的接收。

操作的步骤大致如下:

1)使用一个计时功能2)接收到数据时启动计时,然后之后每收到一个数据重置一次这个计时3)在没有收到数据之后,计时达到了设定的值,接收就算结束了,处理接收到数据,并关闭计时功能。4)下一帧的数据接收,重复上面的步骤。

2.3、串口的空闲中断

这种方式是使用的串口的空闲中断功能,大概原理是在串口配置开启了空闲中断时,如果接收到数据之后就会启动这个串口的空闲状态检测,在一段时间串口不在收到数据就会触发串口的空闲中断,告知完成一次数据的接收。

这种方式显然更好,不用额外再实现空闲检测功能,只要在串口触发中断并是空闲中断的时候,就知道数据完成了接收。

但是,这个功能不是所有的MCU都具备,一般都是在一些高端一点的MCU中才有,低端一些的MCU估计都是没有空闲中断的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次私服GitLab合并分支教程

背景 关于在做项目的时候需要合并分支,第一次听到的时候一脸懵逼。之前都是在主支上面跑的,为此闹了不少笑话,现在记录一下教程步骤 合并请求新建合并请求 比较分支并继续 创建合并请求 构建 完成任务,这是自动化构建合并请求过…

前端面试知识点

基本方法 在 JavaScript 中,push、pop、shift 和 unshift 是用于操作数组的方法,它们的作用如下: push:将一个或多个元素添加到数组的末尾,并返回修改后的数组的新长度。原始数组会被修改。 const array [1, 2, 3]; …

Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)

多线程基础 一、创建线程的五种方法前置知识1、方法一:使用继承Thread类,重写run方法2、方法二:实现Runnable接口,重写run方法3、方法三:继承Thread,使用匿名内部类4、方法四:实现Runnable&…

如何在,Linux中安装Luajit2.*

1.文件下载The LuaJIT Project 2.将下载文件上传到对应的服务器:例如/opt 3.进入对应的文件夹 4.make PREFIX/usr/local,设置安装路径 5.make install,编译安装 6.进入安装目录,cd /usr/local/include/luajit-2.0 7.luajit -v…

SAP FI之定义财务年和财务年度变式(Fiscal Year Variants)

目录 前言 一、财务年度/财务年度变式 二、使用步骤 1.配置步骤 前言 本文主要介绍SAP会计年度和SAP会计年度变式。 一、财务年度/财务年度变式 财务年度可以具有与日历年相同的期间,也可以不同。中国财政年度从1月到12月,称为历年制,有…

基于沙猫群算法优化的BP神经网络(预测应用) - 附代码

基于沙猫群算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于沙猫群算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.沙猫群优化BP神经网络2.1 BP神经网络参数设置2.2 沙猫群算法应用 4.测试结果:5.Matlab代…

WebGL 同一缓冲区多种数据传入顶点着色器 gl.vertexAttribPointer()的步进和偏移参数

目录 目录 为了将顶点坐标传入着色器,需要遵循一下五步: 但是!!! 示例代码: gl.vertexAttribPointer()的函数规范 stride参数 顶点坐标数据 offset参数 顶点尺寸数据 首先…

KaiwuDB 助力能源企业实现 4 大价值提升

行业背景 近年来,随着能源行业数字化的不断推进,智能电网、可再生能源发电、分布式发电、微电网等技术蓬勃发展。越来越多的能源企业意识到数据管理与价值挖掘对储能及能源利用有着重大意义,并开始探索一套有效的数据库解决方案以应对分布式…

Chrome小恐龙快跑小游戏——Python实现

目录 视频演示 代码实现 视频演示 Chrome小恐龙快跑小游戏——Python实现 代码实现 import pygame import os import random pygame.init()# Global Constants SCREEN_HEIGHT 600 SCREEN_WIDTH 1100 game_over False SCREEN pygame.display.set_mode((SCREEN_WIDTH, SCR…

电子词典dictionary

一、项目要求: 1.登录注册功能,不能重复登录,重复注册。用户信息也存储在数据库中。 2.单词查询功能 3.历史记录功能,存储单词,意思,以及查询时间,存储在数据库 4.基于TCP,支持多客户…

三、mycat分库分表

第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了&…

three.js(四):react + three.js

绘制多个立方体 1.搭建reactts 项目 npx create-react-app basics-demo --template typescriptreactts 的用法可参考此链接: https://react-typescript-cheatsheet.netlify.app/docs/basic/setup 2.安装three依赖 npm install three types/three --save3.安装路…

200 套基于Java开发的Java毕业设计实战项目(含源码+说明文档)

文章目录 简介前言第一部分第二部分部分截图源码咨询 简介 博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 前言 对于java方向的毕业设计题目选题&#xf…

Weblogic漏洞(四)之 CVE-2018-2894 任意文件上传漏洞

CVE-2018-2894 任意文件上传漏洞 漏洞影响 Weblogic受影响的版本: 10.3.6.012.1.3.012.2.1.212.2.1.3 漏洞环境 此次我们使用的是vnlhub靶场搭建的环境,是vnlhub中的Weblogic漏洞中的CVE-2018-2894靶场,我们 cd 到 CVE-2018-2894&#x…

R3LIVE源码解析(6) — R3LIVE流程详解

目录 1 R3LIVE框架简介 2 R3LIVE的launch文件 3 R3LIVE的r3live_config文件 4 R3LIVE从哪开始阅读 1 R3LIVE框架简介 R3LIVE是香港大学Mars实验室提出的一种融合imu、相机、激光的SLAM方法,R3LIVE由两个子系统组成,一个激光惯性里程计(L…

【无标题】8.31在华清

可以登录但是不能跳转

怎么用postman连接websocket

点击右侧栏的Collections,然后点击旁边的New,然后点击其中的WebSocket Request,然后输入Url,点击Connection,这里需要注意的是Url不能加上http://,因为这个不是http协议。

23062网络编程day5

根据select TCP服务器流程图编写服务器 #include <myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)#define PORT 8888 #define IP "192.168.114.104"int keyboard_events(void); int cliConnect_…

美国纽约10日游

一、前言 我有两周断更了&#xff0c;原因是去纽约只顾着玩&#xff0c;没时间写&#xff0c;今天有时间正好和大家分享一下去纽约的攻略 二、以下是一个10天去美国纽约旅游的攻略&#xff0c;十万以内&#xff0c;包括机票、酒店、交通、餐饮和景点门票等费用&#xff1a; 第…

Leetcode ->206 反转链表

题目 算法思路及代码实现 #include <iostream> using namespace std;struct ListNode {int val; //当前节点的值ListNode *next;