上位机图像处理和嵌入式模块部署(上、下位机通信的三个注意点)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        如果最终部署在客户现场的是一个嵌入式设备,那么上位机在做好了算法编辑和算法部署之后,很重要的一步就是处理上位机和下位机之间的通讯了。当然,我们可以通过一些开源库来解决通信问题,比如xmlrpc。但是,我们有时候可能需要自定义协议来处理。自定义协议还是有很多好处的,比如说你的嵌入式设备只能和你的上位机进行通信。

        这样如果是自定义协议的话,那么有三个注意点就要小心一下。

1、CPU大小端

        目前我们的笔记本电脑、台式机都是x86或者x64 cpu,这些cpu都是小端结构。而报文协议一般都是大端结构。所谓的小端、大端,主要代表了数据字节的存储次序。举个例子来说,如果有一个整数是0x12345678,那么0x78如果保存在低端地址,那么cpu就是小端;如果0x12保存在低端地址,那么cpu就是大端。写成函数就是这样的,

bool isCpuLittleEndian()
{
	unsigned int val = 0x12345678;
	unsigned char* p = (unsigned char*)&val;

	return (*p == 0x78) ? true : false;
}

        既然是这样,那我们在编写报文的时候,就需要把数据从小端转成大端结构。等到收到报文、解析报文的时候,再把数据从大端解析成小端。这个过程都是少不了的。

2、数据补齐

        很多时候,编译器考虑到cpu访问数据的效率和便利,会有意、无意帮我们做数据对齐的动作。这些动作如果在平时,通常关系不大。但是通信的时候,我们的报文是要和别人的设备做数据交接的,这种情况下一个byte的偏移都是不应该的。所以,在上下文交互的时候,这种数据补齐必须是要避免发生的。举个例子来说,下面这个结构体,

typedef struct _DataVal
{
	short a;
	char b;
	int c;
}DataVal;

        如果不做特殊处理的话,这个数据结构体的大小就是8。但是实际大小应该是7。因为short长度是2,char长度是1,int长度是4,所以整体长度是7。这个时候,如果我们不想编译器帮助我们做数据补齐,应该怎么处理呢,

#pragma pack(1)
typedef struct _DataVal
{
	short a;
	char b;
	int c;
}DataVal;
#pragma unpack

        这个语法目前在visual studio和gdb上都是支持的,大家自己可以好好测试下。通过测试,我们可以清楚地看到,加了pack之后,DataVal的大小是7。

3、json数据的使用

        早期协议开发的时候,特别是协议还没有稳定的时候,临时增添数据、减少数据,这都是很常见的事情。另外,即使协议比较稳定,添加新的客户需求,变更协议,这也不罕见。所以,建议大家可以在协议开发的时候,对于其中一部分内容,可以考虑用json保存和传递,还不用考虑字节序的问题。比如说,发送前,把json转成字节码。收到报文后,再恢复为json数据。虽然传输的效率效率有所降低,但是胜在稳定,易于拓展。朋友们可以在开发的过程中参考下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis 主从表有名字相同,只能查询出一条数据

Mybatis 主从表有名字相同,只能查询出一条数据 重新命名后,可以正常查询

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbi lity的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton(单实例模式)启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

多个地区地图可视化

1. 配置Json文件 1.1 获得每个省份的json数据 打开 阿里云数据可视化平台 主页。 在搜索框中输入所需省份。 将json文件下载到本地。 1.2 将各省份的json数据进行融合 打开 geojson.io 主页 点击 open,上传刚刚下载的 json 文件,对多个省份不断…

SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能

目录 1、负载均衡原理 2、源码分析 2.1、LoadBalanced 2.2、LoadBalancerClient 2.3、RibbonAutoConfiguration 2.4、LoadBalancerAutoConfiguration 2.5、LoadBalancerIntercepor⭐ 2.6、再回LoadBalancerClient 2.7、RibbonLoadBalancerClient 2.7.1、DynamicServe…

JavaScript进阶-高阶技巧

文章目录 高阶技巧深浅拷贝浅拷贝深拷贝 异常处理throw抛异常try/caych捕获异常debugger 处理thisthis指向改变this 性能优化防抖节流 高阶技巧 深浅拷贝 只针对引用类型 浅拷贝 拷贝对象后,里面的属性值是简单数据类型直接拷贝值,如果属性值是引用数…

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

【前端寻宝之路】学习如何使用HTML实现简历展示和填写

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iJ3Ou0qMGFVaqVQq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

哈希表是什么?

一、哈希表是什么? 哈希表,也称为散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,从而加快查找速度。这个映射函数叫做散列函数&#xff08…

【字符串相加】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 字符串相加 方法一: 方法二: 总结 前言 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的…

给你N个整数,要求删除最大和最小的数之后按原顺序输出。

给你N个整数&#xff0c;要求删除最大和最小的数之后按原顺序输出。 输入输出格式 输入描述: 第一行输入一个整数N&#xff0c;N<100。 第二个输入N个整数。 输出描述: 按题意输出。#include <iostream> using namespace std; int main() {int n;cin >> n;int…

Vue2->3

Vue2->3 认识Vue31. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 熟悉项目和关键文件组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖…

Scratch 第十六课-弹珠台游戏

第十六课-弹珠台游戏 大家好&#xff0c;今天我们一起做一款弹珠台scratch游戏&#xff0c;我们也可以叫它弹球游戏&#xff01;这款游戏在刚出来的时候非常火爆。小朋友们要认真学习下&#xff01; 这节课的学习目标 物体碰撞如何处理转向问题。复习键盘对角色的控制方式。…

ubuntu环境下docker容器详细安装使用

文章目录 一、简介二、ubuntu安装docker1.删除旧版本2.安装方法一3. 安装方法二&#xff08;推荐使用&#xff09;4.运行Docker容器5. 配置docker加速器 三、Docker镜像操作1. 拉取镜像2. 查看本地镜像3. 删除镜像4. 镜像打标签5. Dockerfile生成镜像 四、Docker容器操作1. 获取…

AtCoder ABC343 A-D题解

Problem A: 签到题。 #include <bits/stdc.h> using namespace std; int main(){int A,B;cin>>A>>B;for(int i0;i<10;i){if(i!(AB))cout<<i<<endl;//记得return} } Problem B: 依旧签到。 include <bits/stdc.h> using namespace …

实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启

作用&#xff1a;在服务器CPU高负载时发送邮件通知 目录 一、功能代码 二、配置开机自启动该监控脚本 1&#xff0c;配置自启脚本 2&#xff0c;启动 三、功能测试 一、功能代码 功能&#xff1a;在CPU负载超过预设置的90%阈值时就发送邮件通知&#xff01;邮件内容显示…

求阶乘。。

&#xff01;&#xff01;&#xff01;答案解释摘录自蓝桥云课题解 问题描述 满足N!的末尾恰好有个0的最小的N是多少? 如果这样的N不存在输出-1。 输入格式 一个整数 K 输出格式 一个整数代表答案 样例输入 2 样例输出 10 import os import sys# 请在此输入您的代码 def coun…

懒人必备|视频号片段提取实战教程!

你是否也为如何提取视频号的视频感到困扰&#xff1f;想要留住那些美好瞬间&#xff0c;但又不知道改如何操作&#xff1f;别瞎找了&#xff01;今天就让我来教你正确的步骤&#xff0c;让你轻松成为“提取达人”&#xff01; 首先&#xff0c;打开想要提取的视频&#xff0c;找…

某u盘 对比 sd卡+读卡器

部分 u盘 性能甚至不如 读卡器SD卡 电脑 支持USB3 gen2 的 USBA接口(u盘用) 和 typec接口(读卡器用) 极致性能需求可考虑: m.2固态硬盘盒m.2固态 设备 速度对比 迅雷... 拷贝文件信息 共用格式化信息

青少年软件编程(Python)等级考试试卷(一级)2020年3月

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09;2020年3月 第 1 题 【单选题】 运行下方代码段&#xff0c;输出的是( )。 print("a"*3) A :a3 B :3a C :a a a D :aaa 正确答案:D 试题解析 第 2 题 【单选题】 下…

SpringBoot整合rabbitmq-重复消费问题

说明&#xff1a;重复消费的原因大致是生产者将信息A发送到队列中&#xff0c;消费者监听到消息A后开始处理业务&#xff0c;业务处理完成后&#xff0c;监听在告知rabbitmq消息A已经被消费完成途中中断&#xff0c;也就时说我已经处理完业务&#xff0c;而队列中还存在当前消息…