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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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数据。虽然传输的效率效率有所降低,但是胜在稳定,易于拓展。朋友们可以在开发的过程中参考下。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis高级特性和应用(发布、订阅、Stream、慢查询、Pipeline、事务、Lua)

Redis高级特性和应用 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息,订阅该频道的每个客户端都可以收到该消息。 操作命令 Redis主要…

Android自定控件感觉无从下手看这里

文章目录 三个方法标准自定义控件的要求一、自定义View二、测量:onMeasure2.1、测量并得到高度和宽度后的运行效果2.2、此外我们还要加上pading的距离,否则我们在xml中设置的padding就不会生效2.3、 至此一个简单的自定义View已经完成,自定义…

CTFHUB--文件包含漏洞--RCE

文件包含漏洞 文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,…

凌特杯,第二届,数字音频传输。simulink matlab

终于比赛进入了尾声,最为指导老师也是非常的激动。接下来进入了论文写作阶段和视频拍摄阶段。 第二届凌特杯规定的硬件是ADI的Pluto,成本在2k以内,能支持MATLAB,它能够流畅的实时播放接收到的音乐数据,并把数据保存成…

为什么要在业务系统中引入大宽表?

在高度系统化驱动的业务中,查看业务报表已经是一个很常见的需求了。在分工非常明确的大型企业里,往往有专门的数据分析团队 BI 或者数据开发团队,他们能够胜任此类需求(但也未必是轻松的,或者说高效的)。 …

14-Linux部署Hadoop集群

Linux部署Hadoop集群 简介 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2)主要解决,海量数据的存储和海量数据的分析计算问题。 Hadoop HDFS 提供分布式海量数据存储能力 Hadoop YARN 提供分布式集群资源管理能力 Hadoop…

【双指针】删除有序数组中重复元素,双指针原地修改数组

删除有序数组中重复元素 链接 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-duplicates-from-sorted-array/…

2024.03.01作业

1. 基于UDP的TFTP文件传输 #include "test.h"#define SER_IP "192.168.1.104" #define SER_PORT 69 #define IP "192.168.191.128" #define PORT 9999enum mode {TFTP_READ 1,TFTP_WRITE 2,TFTP_DATA 3,TFTP_ACK 4,TFTP_ERR 5 };void get_…

Java 石头剪刀布小游戏

一、任务 编写一个剪刀石头布游戏的程序。程序启动后会随机生成1~3的随机数,分别代表剪刀、石头和布,玩家通过键盘输入剪刀、石头和布与电脑进行5轮的游戏,赢的次数多的一方为赢家。若五局皆为平局,则最终结果判为平局。 二、实…

项目运维方案

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 软件开发全套资料获取:软件开发全套资料_数字中台建设指南-CSDN博客

Redis安全加固策略:配置文件权限设置 配置本地日志存储目录 连接超时时间限制

Redis安全加固策略:配置文件权限设置 & 配置本地日志存储目录 & 连接超时时间限制 1.1 配置文件权限设置1.2 配置本地日志存储目录1.3 连接超时时间限制 💖The Begin💖点点关注,收藏不迷路💖 1.1 配置文件权限…

(六)Dropout抑制过拟合与超参数的选择--九五小庞

过拟合 即模型在训练集上表现的很好,但是在测试集上效果却很差。也就是说,在已知的数据集合中非常好,再添加一些新数据进来效果就会差很多 欠拟合 即模型在训练集上表现的效果差,没有充分利用数据,预测准确率很低&a…