C# WPF上位机开发(通讯协议的编写)

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

        作为上位机,它很重要的一个部分就是需要和外面的设备进行数据沟通的。很多时候,也就是在这个沟通的过程当中,上位机软件才有了自己的价值。如果上位机可以通过收集数据,进一步构建自己的算法,那么上位机自身的价值就更大了。之前说的usb、can、232这些都是沟通的媒介,本质上最重要的还是通讯的协议。

        所谓通讯的协议,其实就是沟通的方式和报文的格式。沟通的方式,一般代表谁先主动发起沟通,谁被动应答沟通;报文的格式,则代表每次沟通的数据有多少个,每个数据代表着什么样的含义。这就是通讯的全部内容。

1、通讯沟通的方式

        大部分上位机在沟通的时候都是作为主动的一方存在的,被沟通的设备一般都是被动响应报文的。比如说一个卷帘门设备、一个充电设备、一个机器人设备等等,基本上都是上位机要求它做什么,它就会去做什么。在作业的过程中,上位机会不停轮询当前的工作状态。

2、哪里可以看到数据协议

        这种协议还是很多的。如果是网站服务器类的协议,这种一般都是私有协议,只需要和对应网站的开发人员搞好对接就可以了;如果是设备类的协议,那么我们通过线上或者线下的方式拿到设备之后,就可以通过它们的售后人员拿到对应设备的开发协议。当然,现在很多设备供应商也会提前在自己的官网或者是github上发布对应的通讯协议,这都是可能的。

3、常见的协议有哪几种

        对于工控领域来说,最常见的协议就是modbus协议,它的通讯格式非常简单,就是简单的应答模式。上位机发送一个请求,设备回复一个请求。主要的请求也只有读写两种模式,读写的报文也很短,一般就十几个字节,这也是因为本身modbus设备功能比较单一,十几个字节加上对应的bit位,其实很容易把大部分功能就说清楚了。

4、某设备232通信协议分析

4.1 读设备协议

        这就是一个读设备协议,整个数据是16进制形式,数据内容是0x0101006400087c13。整个数据有8个字节。第一个01代表设备地址,第二个01代表功能,这里是读。第三、四个字节是0064,转成10进制就是100,代表寄存器地址是100。第五、六个字节是0008,代表需要读8个寄存器。第七、八两个字节7c13,这个是校验码,一般通过crc算法计算得到。

4.2 读设备返回协议

        如果我们按照4.1的形式发送数据之后,那么没什么问题的话,上位机就会从设备读到返回的数据。假设这个数据是0x0101010f118c。这个时候和4.1一样,我们只需要按照官方给出的example去一个一个字节解析就可以了。从长度上看,返回的数据只有6个字节。第一个字节01代表设备地址。第二个字节01代表功能码01,即读。第三个字节代表数据长度01,即1个字节。第四个字节0F代表返回的数据0F。第五、六个字节0x118c代表检验码,用户可以根据校验码判断一下下发的数据是否有错误。

        这里可以思考下,假设返回的数据是4个,那么格式应该是什么样的?比如说还是这里,那么返回的数据可能是这样的,01+01+04+0000000f+校验码2个字节,这样所有的数据长度加起来就是9个字节。

4.3 写设备协议

        和读设备协议相比较,读设备协议稍微复杂了一点。这里写设备的命令是0x010f00640008010fcf59。其中有两个个地方需要注意一下,第一,功能吗从01变成了0f。第二,和读设备相比较,这里多了一个010f,其中01代表要写的数据长度,0f代表要写的数据内容。其他部分和读设备协议差别不大。

4.4 写设备返回协议

        和写设备协议相比较,写设备返回则简单很多。基本上,把写的数据长度、写数据内容拿走,剩下来就是写设备返回的内容。当然,对应的校验码肯定也发生了改变。

5、数据内容代表什么

        前面我们讨论了设备协议,但是大家有没有注意,我们没有讨论读写数据里面的内容。这主要是因为,具体数据的含义其实和设备本身是相关的,它可能是一个门、一个灯、一个开关、一个电机、一个显示屏幕,凡此种种,我们使用的时候再分别分析具体的bit位、具体的数据含义就可以了。这次要学习的主要就是怎么分析这个通信协议的逻辑。

6、其他要注意的地方

        编写协议的时候,还是需要非常小心的,通常来说有这么几点要注意;

        1)注意字节序;

        2)注意每个bit的含义;

        3)一收一发,不断检验执行的返回结果;

        4)严格根据设备的要求,保证输入参数的合法性;

        5)大胆怀疑,小心假设;

        6)出问题的时候,大部分是参数没设置好、环境发生了变化,设备出问题概率不大。

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

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

相关文章

PyQt下使用OpenCV实现人脸检测与识别

背景: 一 数字图像处理与识别警务应用模型 基于前期所学知识,与公安实践相结合,综合设计数字图像处理与识别警务应用模型,从下列4个研究课题中选择2个进行实验实现:图像增强与复原、人脸检测与识别、虹膜内外圆检测与分割、车牌…

Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

Html转PDF,前端JS实现Html页面导出PDF(html2canvasjspdf) 文章目录 Html转PDF,前端JS实现Html页面导出PDF(html2canvasjspdf)一、背景介绍二、疑问三、所使用技术html2canvasjspdf 四、展示开始1、效果展示…

C语言----文件操作(一)

一:C语言中文件的概念 对于文件想必大家都很熟悉,无论在windows上还是Linux中,我们用文件去存储资料,记录笔记,常见的如txt文件,word文档,log文件等。那么,在C语言中文件是什么样的存…

threadpool github线程池学习

参考项目 https://github.com/progschj/ThreadPool 源码分析 // 常规头文件保护宏, 避免重复 include #ifndef THREAD_POOL_H #define THREAD_POOL_H// 线程池, 存储线程对象; #include <vector>// 任务队列, 双向都可操作队列, queue 不能删除首个元素 #include <…

微信小程序制作-背单词的小程序制作

微信小程序–背单词的 好久没有发过文章了&#xff0c;但是不代表着我不去学习了喽&#xff0c;以下是我最近做的东西&#xff0c;前端的UI由朋友设计的&#xff0c;目前这个是前端使用的是微信小程序后端是Python的一个轻量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

MyBatis 四大核心组件之 Executor 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

List 接口

1 List 接口 java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。 List是一种常用的集合类型&#xff0c;它可以存储任意类型的对象&#xff0c;也可以结合泛型来存储具体的类型对象&#xff0c;本质上就是一个容器。 1.1 List 类型介绍 有序性…

06-React组件 Redux React-Redux

React组件化&#xff08;以Ant-Design为例&#xff09; 组件化编程&#xff0c;只需要去安装好对应的组件&#xff0c;然后通过各式各样的组件引入&#xff0c;实现快速开发 我们这里学习的是 Ant-design &#xff08;应该是这样&#xff09;&#xff0c;它有很多的组件供我们…

计算机网络测试题第二部分

前言:如果没有做在线测试请自主独立完成&#xff0c;本篇文章只作为学习计算机网络的参考&#xff0c;题库中的题存在一定错误和不完整&#xff0c;请学习时&#xff0c;查找多方书籍论证&#xff0c;独立思考&#xff0c;如果存在疑虑可以评论区讨论。查看时&#xff0c;请分清…

pytorch debug 常用工具

自动辨识图像格式可视化 import numpy as np import matplotlib.pyplot as plt from PIL import Imagedef convert_to_numpy(image_input):"""自动检测输入图像类型&#xff0c;并将其转换为NumPy数组。"""if isinstance(image_input, np.ndarr…

7-3 Left-pad

根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块&a…

物联网IC

物联网IC 电子元器件百科 文章目录 物联网IC前言一、物联网IC是什么二、物联网IC的类别三、物联网IC的应用实例四、物联网IC的作用原理总结前言 物联网IC的功能和特性可以根据不同的物联网应用需求来选择和配置,以满足物联网设备在连接、通信、感知和控制方面的需求。 一、物…

猜数字游戏Ⅱ

你和朋友一起玩猜数字游戏&#xff0c;你写出一个秘密数字&#xff0c;请朋友猜这个数字是多少。朋友每猜测一次&#xff0c;你就会给他一个包含下述信息的提示&#xff1a; 猜测数字中有多少位属于数字和确切位置都猜对了&#xff08;称为 "Bulls"&#xff0c;公牛&…

VOL-vue 框架 文件上传控件关于大文件上传等待的修改

我的项目在测试voltable列表组件中对阿里云OSS做附件上传时&#xff0c;几十M的文件可能就会需要一段时间来上传&#xff0c;才能有OSS的状态和链接返回。 但是控件VolUpload.vue并没有去在这方面做任何交互体验上的控制&#xff0c;而且VolUpload.vue本身写的几个上传函数都是…

SpringBoo在项目停止(服务停止/关闭退出)之后执行的方法

SpringBoo在项目停止/服务停止/关闭退出之后执行的方法 1.实现DisposableBean接口2.使用PreDestroy注解 SpringApplication会向JVM注册一个关闭钩子(hook)&#xff0c;以确保ApplicationContext在退出时正常关闭。 可以使用所有标准的Spring生命周期回调&#xff08;例如Dispos…

内测分发是什么?十年的前端开发者带你了解

内测分发是软件开发过程中的一个阶段&#xff0c;特别指软件还未完全完成或准备对外广泛发布前&#xff0c;向一定范围的用户群体提供该软件版本的测试机会&#xff0c;以便收集反馈和修复潜在的问题。在讲解内测分发之前&#xff0c;我们需要明确几个相关概念&#xff1a; 软件…

区块链媒体宣发:揭示优势与趋势,引领信息传播新时代

在数字化潮流中&#xff0c;区块链技术正以惊人的速度改变着传媒行业的格局。从区块链媒体宣发中获得的种种优势和未来的趋势&#xff0c;不仅为企业带来了新的推广途径&#xff0c;也在信息传播领域掀起了一场革命。本文将深入探讨区块链媒体宣发的优势以及未来的发展趋势。 1…

排序算法---选择排序

1.实现流程&#xff1a; 1. 把第一个没有排序过的元素设置为最小值&#xff1b; 2. 遍历每个没有排序过的元素&#xff1b; 3. 如果元素 < 现在的最小值&#xff1b; 4. 将此元素设置成为新的最小值&#xff1b; 5. 将最小值和第一个没有排序过的位置交换 选择排序执行流程…

初识Ceph --组件、存储类型、存储原理

目录 ceph组件存储类型块存储文件存储对象存储 存储过程 ceph Ceph&#xff08;分布式存储系统&#xff09;是一个开源的分布式存储系统&#xff0c;设计用于提供高性能、高可靠性和可扩展性的存储服务&#xff0c;可以避免单点故障&#xff0c;支持块存储、对象存储以及文件系…

【小白专用】Apache2.4+PHP8.3+MYSQL的配置

1.下载PHP和Apache 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作为服务器的话&#xff0c;一定要下载Thread Safe的&#xff0c;否则没有php8apache2_4.dll这个文件&#xff0c; 如果使用IIS的请下载 NON Tread safe的 2.如果…