当前位置: 首页 > news >正文

嵌入式设备与PC上位机通信协议设计的几点原则

嵌入式设备在运行中需要设置参数,这个工作经常由PC机来实现,需要为双方通信设计协议,有代表性协议是如下三种:

图片

 

从上表可以看到,一般嵌入式设备内存和运算性能都有限,因此固定二进制是首选通信协议。

一.  简单性

保证协议是一个简单的方案,晦涩难懂往往意味着实现困难和容易出错。协议的结构宜采用平面方式,每个域作用明确,数据域尽可能设计得长度和位置固定,注释详尽,文档清晰,实例丰富,让人尽快上手和理解。

协议一般都需要以下域:帧头,长度,帧类型,目标地址,源地址,数据,校验,帧尾。

二.  可扩展

必须保证将来增加功能和更改硬件后协议仍能胜任工作,这往往是通过预留空间来实现,协议的变更应该只是量的增加,不至于引起协议结构的变化。

三.  低耦合

理想情况下每个协议包是原子信息,即本协议包不与其他协议包牵连,以防止通讯丢帧和设置牵连带来的错误。

四.  稳定性

协议包长度适宜:太小包含的信息过少,协议包的种类繁多,容易引起通讯混乱和牵连错误;太大包含的信息过多,可读性较差,组帧和解帧的工作困难,还会带来通讯易受干扰的缺陷,一般协议长度以最小原子性信息为标尺。

协议必须包括校验机制,以便于接收方判别协议包正确完整接收,如果出错需要较好的机制来确保通讯成功(如重传)。

五.  高效率

按信息类型区分协议包类别,如:设置网络信息参数,设置当前运行参数,可以区分开来,方便程序处理。

将同种操作编码为一个子集是一种高效手段,如Read操作,编码为0x0010,Write操作,编码为0x0020。

数据尽可能设计成同构模式,如果实在有差异,至少将同类型数据放置在一起,这样程序可以充分利用指针和线性寻址加速处理。

六.  易实现

尽量减少复杂算法的使用,如,通讯链路稳定,数据帧的校验码可以由CheckSum代替CRC。除非资源非常紧张,否则不要将过多的信息挤压在一个数据里,因为它会带来可读性差和实现困难。

七.软件开发

尽可能地让硬件ISR完成驱动工作,不要让“进程”参与复杂的时序逻辑,否则处理器将步履蹒跚且逻辑复杂!如:

接收固定长度的数据帧,可以使用DMA,每接收完一帧DMA_ISR向进程发消息。小心处理DMA断层异常(接收的数据帧长度正常但数据错误,数据为上帧的后半部分+本帧的前半部分)。

接收不定长的数据帧,可以使用状态机,当接收到“帧尾数据”时向进程发消息。

相关文章:如何高效解析不定长度的协议帧

小心数据紊乱和超时异常(数据紊乱时需要将状态机及时复位,超时一般使用定时器监控)。

八. 考虑硬件

如果通信链路是高速总线(如SPORT可达100Mbps),一般设计成一帧产生一次中断,它通过长度触发的DMA来实现,需要将协议设计成固定长度,如附录A。它具备高效率,但灵活性较差。

如果通信链路是低速总线(如UART一般100kbps),一般接收一字节产生一次中断,可以将协议设计成变长帧,如附录B。它具备高灵活性,但效率较低。

附录A 一个基于DMA传输固定长度的协议实例

图片

 

如图显示了PC发送数据帧的格式,总长为64字节,是4字节的整倍数,符合绝大部分32位处理器结构体对齐的特性。

  • 0x3C:INT8U,帧头,可见字符’<’

  • Len:INT8U,本帧的总数据长度,在图4即为64

  • Dst:INT8U,标识目标设备的ID号

  • Src:INT8U,标识源设备的ID号

  • Data:56字节的存储区,内容依赖于具体的通信帧(实例见表2)

  • Cmd:INT16U,数据帧的类别

  • CS:INT8U, 对它前面所有数据(62字节)进行8位累加和校验

  • 0x7D:INT8U, 帧尾,可见字符’}’

Data域数据结构实例:

图片

 

附录B 一个基于变长格式的UART通信协议实例

PC 与 iWL880A(一种无线通信产品,详见www.rimelink.com)通信帧采用变长格式,如下图所示。大部分设备(常见为PC机)对于接收以“回车符”的机制很好处理,协议中的Tail就等于0x0D(换行符)。

图片

相关文章:

嵌入式设备与PC上位机通信协议设计的几点原则

嵌入式设备在运行中需要设置参数&#xff0c;这个工作经常由PC机来实现&#xff0c;需要为双方通信设计协议&#xff0c;有代表性协议是如下三种&#xff1a; 从上表可以看到&#xff0c;一般嵌入式设备内存和运算性能都有限&#xff0c;因此固定二进制是首选通信协议。 一&am…...

Go 内置运算符

一、算数运算符 1、算数运算符使用 package mainimport ("fmt" )func main(){fmt.PrintIn("103",103) //10313fmt.PrintIn("10-3",10-3) //10-37fmt.PrintIn("10*3",10*3) //10*330//除法注意&#xff1a;如果运算的数都是…...

Table和HashBasedTable的使用案例

------------------- 1.普通使用 package org.example.testhashbasedtable;import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table;import java.util.Map;public class TestHashBasedTable {public static void main(String[] args) {Ta…...

【执行批处理后 executeBatch() 没反应,一个参数相信就能搞定】

一、场景是在使用EasyExcel读取全表时&#xff0c;每次手动提交事务6w多条&#xff0c;总计190w数据量的情况下发生的。 博主比较fw&#xff0c;卡住了两天&#x1f636; 此问题还有一个比较bug的地方&#xff0c;就是当你在 executeBatch() 上下打断点时还能够执行出来&…...

【LeetCode】每日一题 2023_11_25 二叉树中的伪回文路径(dfs,数组/位运算)

文章目录 刷题前唠嗑题目&#xff1a;二叉树中的伪回文路径题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 这个月第一次周末早起~ 题目&#xff1a;二叉树中的伪回文路径 题目链接&#xff1a;1457. 二…...

什么是海外私人IP代理?是纯净独享的代理吗?

相信许多互联网工作者都遇到过IP禁令&#xff0c;比如网络抓取项目&#xff0c;使用共享代理服务器向网站发出第一个请求&#xff0c;但却您收到了禁令&#xff0c;这大部分是由于你的共享IP经过多人使用被禁用所致。 那么到底什么是私人代理呢&#xff1f;它们是否适合您的情…...

Vue组件库推荐:Element UI深度解析

在Vue开发中&#xff0c;使用组件库可以极大地提高开发效率&#xff0c;减少重复工作量。Element UI作为一款优秀的Vue组件库&#xff0c;被广泛应用于各类项目中。本文将对Element UI进行深度解析&#xff0c;为开发者提供详细的使用说明和具体的代码示例。 1&#xff0c;Ele…...

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址&#xff1a;MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包&#xff0c;仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…...

基于Django+Tensorflow卷积神经网络鸟类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 介绍一个基于DjangoTensorflow卷积神经网络鸟类识别系统是一个非…...

史上最全前端知识点+高频面试题合集,十二大专题,命中率高达95%

前言&#xff1a; 下面分享一些关于阿里&#xff0c;美团&#xff0c;深信服等公司的面经&#xff0c;供大家参考一下。大家也可以去收集一些其他的面试题&#xff0c;可以通过面试题来看看自己有哪里不足。也可以了解自己想去的公司会问什么问题&#xff0c;进行有针对的复习。…...

我叫:基数排序【JAVA】

1.自我介绍 基数排序(radix sort)属于“分配式排序” (distribution sort)&#xff0c;又称“桶子法” (bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,是‘桶排序’的扩展 2.基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数…...

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用【鸿蒙专栏-05】

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用 HarmonyOS,作为一款全场景分布式操作系统,为了推动更广泛的应用开发,采用了一种先进而灵活的编程语言——ArkTS。ArkTS是在TypeScript(TS)的基础上发展而来,为HarmonyOS提供了丰富的应用开发工具,使开…...

智慧城市内涝积水监测仪功能,提升城市预防功能

内涝积水监测仪不仅改变了人们应对城市内涝的老办法&#xff0c;还让智慧城市往前迈了一大步。这个监测仪是怎么做到的呢&#xff1f;就是靠它精准的数据监测和预警&#xff0c;让城市管理有了更科学高效的解决妙招。它就像有了个聪明又负责任的助手&#xff0c;让城市管理更加…...

ISCTF2023 部分wp

学一年了还在入门( web where_is_the_flag ISCTF{41631519-1c64-40f6-8dbb-27877a184e74} 圣杯战争 <?php // highlight_file(__FILE__); // error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择…...

springboot(ssm毕业生学历证明系统Java(codeLW)

springboot(ssm毕业生学历证明系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据…...

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 分布式锁实现原理与最佳实践 2..znode节点类型&#xff1a; 永…...

每日博客Day8

每日博客Day 8 每日算法 206.翻转链表 个人第一次思路&#xff1a; 其实我个人的第一个思路是比较暴力的&#xff0c;我第一遍暴力遍历链表&#xff0c;把链表的所有数值全部都保存到数组里面&#xff0c;然后翻转这个数组&#xff0c;再重复的覆盖当前的这个链表。但是这样…...

Redis-主从与哨兵架构

Jedis使用 Jedis连接代码示例&#xff1a; 1、引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、访问代码 public class JedisSingleTe…...

PTA 7-3 将数组中的数逆序存放

本题要求编写程序&#xff0c;将给定的n个整数存入数组中&#xff0c;将数组中的这n个数逆序存放&#xff0c;再按顺序输出数组中的元素。 输入格式: 输入在第一行中给出一个正整数n&#xff08;1≤n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开。 输出格式:…...

JavaScript 如何拷贝对像(Object)或者数组(Array)

目录 JavaScript数据拷贝类型 浅拷贝 深拷贝 举例&#xff1a; 浅拷贝 数组 对象 深拷贝 lodash cloneDeep使用示例 自定义深拷贝方法示例 JSON.parse() 和 JSON.stringify()使用示例 JavaScript数据拷贝类型 浅拷贝 数组可以使用Array.prototype.slice()方法 …...

JDK 1.8 vs JDK 17:jvisualvm 安装配置全攻略(附Visual GC插件避坑指南)

JDK 1.8 vs JDK 17&#xff1a;jvisualvm 安装配置全攻略&#xff08;附Visual GC插件避坑指南&#xff09; 在Java开发的世界里&#xff0c;JVM性能调优一直是开发者进阶的必修课。而jvisualvm作为Oracle官方提供的免费性能分析工具&#xff0c;可以说是我们窥探JVM内部运行状…...

论文精读:突破大模型推理瓶颈:为什么“限制自信”反而能让 AI 更聪明?

论文下载地址&#xff1a;https://arxiv.org/pdf/2502.07154 随着 OpenAI o1 等推理模型的爆火&#xff0c;AI 行业正在经历一场深刻的范式转移&#xff1a;从单纯依赖“扩大训练规模&#xff08;Training-Time Scaling&#xff09;”&#xff0c;正式步入“扩大测试期计算&am…...

配置嵌入式Linux系统从NFS启动

配置嵌入式Linux系统从NFS启动 嵌入式Linux开发时&#xff0c;需要频繁将开发的程序下载到嵌入式电路板上运行&#xff0c;尽管采用各种文件传输工具能比较方便的再宿主机和开发电路板之间进行文件传输&#xff0c;但每次操作需要操作略显繁琐。此处记录在开发中经常使用到的嵌…...

linux (CentOS 7) 一次性安装中文手册的完整命令

一&#xff0c;一次性第一步&#xff1a;安装 CentOS 7 专属的中文语言包 man 手册包yum install -y kde-l10n-Chinese man-pages-zh-CN第二步&#xff1a;刷新语言环境&#xff0c;让配置生效export LANGzh_CN.UTF-8第三步&#xff1a;验证&#xff0c;直接执行中文 man lsma…...

Soundpad 免安装绿色版 下载 游戏语音与直播的专业音效播放神器

简介说明 Soundpad&#xff1a;游戏语音与直播的专业音效播放神器 Soundpad 是由德国独立开发者 Leppsoft 推出的 Windows 平台专业音效板&#xff08;Soundboard&#xff09;软件&#xff0c;核心功能是将本地音频文件实时混入麦克风信号&#xff0c; 在语音聊天、游戏内语音…...

OpenClaw自动化周报:Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告

OpenClaw自动化周报&#xff1a;Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告 1. 为什么需要自动化周报 每周五下午&#xff0c;我都会陷入一种"周报焦虑"——要手动整理Git提交记录、JIRA任务状态、代码评审意见&#xff0c;再用Excel做数据透视&#xff0c;最后…...

电机速度计算

1. M法计算速度值详解&#xff1a;原理、公式与应用 概述 M法&#xff0c;也称为频率测量法&#xff0c;是一种通过在固定时间内统计脉冲数量来计算速度的常用方法。这种方法特别适用于中高速运动的测量场景&#xff0c;在电机控制、编码器测速等领域有着广泛的应用。 &#x1…...

[资源管理]:全链路智能化的Manifest协同方案

[资源管理]&#xff1a;全链路智能化的Manifest协同方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 定位核心矛盾&#xff1a;资源管理的系统性困境 在数字内容分发领域&#xff0c;Manife…...

边缘计算与云原生集成:构建智能边缘系统

边缘计算与云原生集成&#xff1a;构建智能边缘系统 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我深知边缘计算在现代 IT 架构中的重要性。随着物联网设备的爆发式增长和 5G 技术的普及&#xff0c;边缘计算已经成为云计算的重要补充&#xff0c;为实时数据…...

Virtuoso ADE L仿真结果分析实战:用Calculator快速提取带宽、相位裕度和噪声

Virtuoso ADE L仿真结果深度解析&#xff1a;从波形到关键指标的实战技巧 面对仿真完成后满屏的波形曲线&#xff0c;许多工程师常陷入"数据丰富但信息匮乏"的困境。本文将聚焦两级运放案例&#xff0c;演示如何用Calculator函数精准提取GBW、相位裕度、噪声谱密度等…...