自定义协议的这些典型例子你会了吗?

有位读者朋友问数据为什么要按这样的格式来发。其实这是个自定义协议,这是上位机开发者定义的一个数据交互协议。

我们下位机往伏特加上位机发送数据需要遵循这样的协议数据,才能保证上位机能正确识别这些数据。

关于自定义协议,对于会的人很简单,对于不会的人就摸不着头脑。下面分享一些关于自定义协议的笔记,希望能对初学者有帮助,也希望大神们能多多指出不足

什么是协议?

协议这个概念我觉得挺杂的。就像嵌入式的概念一样,说法不一,比如大家常常争论FPGA是不是嵌入式、单片机是不是属于嵌入式等等。下面简单看一下嵌入式中协议这个概念。

在互联网领域,协议常常指的是网络协议。

在嵌入式中,协议按大类分主要可分为底层协议(硬件层协议/物理层协议)与上层协议(用户层协议/应用层协议),根据实际还可细分成很多层。

底层协议如串口、SPI、I2C等,底层协议决定着数据传输的方式(传输数据需要多少条信号线,传输数据的时序是怎样的)。上层协议决定着这些数据是拿来干什么用的。太难解释了。。看实例吧:

这是多功能电能表的协议通讯协议,其中底层协议是485通讯,上层协议有很多条,但格式基本都统一:

每一帧(包)数据的格式都类似是这样子的格式,例如读数据协议:

主站往从站发送数据(控制器->智能电表):

从站往主站发送数据(智能电表->控制器):

明确了协议之后,该发什么数据、收到的数据是怎么样我们都心里有数,那么这个通信的过程就很明朗了。

一般控制器往外发送协议数据都比较简单,重点是返回数据的处理(解析),解析方式根据协议的不同而有不同的方法。

协议(上层协议)按照通用性来分可以分为专有协议与自定义协议,例如上面电表的协议其实是专有协议(具有一些标准的协议):

自定义协议就是我们开发者可以针对一些应用、一些需求自己制定的一些协议。下面来分享一些常见的自定义协议:

常见的自定义协议

在我们嵌入式开发中,自定义协议的应用很多。例如上下位机之间的通讯、控制器与控制器之间的通讯、服务器与设备终端之间的通讯等。

自定义协议也没有什么特定的规范、标准,可以很灵活地制定,只要能满足开发需要即可。下面依旧以实例来做分享:

例子一(典型):

之前有个物联网项目,服务器往我们终端设备发送的协议数据类似于:

我们设备终端需要用到协议数据中字段的实际数据,整个数据包是字符串的形式,这时候可以用sscanf函数来做解析:

char tmpBuf[TMP_BUF_LEN];
char *cmd_str = tmpBuf;
uint16_t num = 0;
uint16_t devid = 0;

if (sscanf(buf, "Data=%s,%d,%d", cmd_str, &num, &devid)!=3 )
{
return -1;
}

关于sscanf函数就不做解释了,不会的朋友自行百度。sscanf函数在做类似的解析非常好用,很多时候都可以使用。如:

因为是两端通讯,当然要确保通讯的正确性。比如服务器往设备发送数据,怎么知道有没有发送,这就得设备端在收到数据的同时回应相应的数据包。

可以使用与sscanf函数相对应的sprintf函数做组包操作。比如(这个sprintf例子与上例无关,只是为了说明一下sprintf的用法):

一端给另一端发送数据一般有两种,以设备端在往服务端发送数据为例:

(1)当设备收到服务端的数据时,会回应与之对应的数据,这称为被动应答

(2)设备主动给服务端发送数据,例如设备常常定时、主动地给服务端发送一些时间戳信息等(俗称心跳包),这样服务端就知道设备是在正常工作的(活着的状态)。这称为主动发送主动申请

在处理这些字符串形式的协议数据的时候用sscanf、sprintf、strcmp、strstr、strcat等函数非常方便,有时候可以搭配正则表达式来做匹配。

例子二(典型):

之前有个项目需要从控制板显示主控制板的运行状态,两控制板之间使用的底层协议为485协议。上层协议(从控板接收数据协议)如:

这里省略的部分为其他信息,比如整个数据包的长度等。

解析函数如:

这里的应用比较简单,只是解析一个报警信息来显示。有时候需要用到整个数据包里的数据,这时候我们可以建立一个结构体来保存所有我们需要的数据,这样方便我们清晰、有条理地对数据进行处理。例如:

例子三(其它):

上面的两个例子中的自定义协议是比较典型的、用得比较多的。

下面也分享其它我自己的一些例子,很多时候为了满足我们自己通讯应用的需要,我们也会自己建立一些自己的小协议来满足我们的需求。

(1)例子一

之前使用串口屏与STM32通讯的时候,我有制定一些的协议。

为了让STM32能识别我串口屏不同页面发送的数据,必须要制定一条协议来识别页面:

这样,每切换至不同的页面时,就会往STM32发送关于页面的协议数据,这样我们就可以知道当前处于哪个界面。

为了让STM32能接收到正确的WiFi设置信息(如何区分WiFi名与密码),必须要给WiFi信息添加一些辅助协议数据,如:

相应的解析处理函数:

(2)例子二

之前在一个单相用电器监测的应用中,有用到zigbee无线通讯,即其中一块控制板做采集板,另一块控制板做显示板。

有些朋友可能会有疑问为什么不做在同一块板上?其实这是一道全国大学生电赛题(《省电赛一等奖作品:单相用电器分析监测装置》),我们只是根据题目要求来做的:

我们当时在做这个通讯时也是有制定一个简单的协议,在数据前面加个标识,就像JSON格式数据的键值对。关于JSON数据可阅读:

我们制定的协议如:

相应的解析及结果:

类似这样子的协议解析实际上是有套路的,摸清楚这些套路之后以后在做类似应用的时候其实就很简单了。

重点掌握sscanf、sprintf、strcmp、strstr、strcat等函数以及上面的两种典型例子。

小编在三个地方搬过砖,每个地方都有用到类似的自定义协议,而且都形成专门的协议文档,每次做类似通讯类的应用的时候,都会按照这样已份协议文档来修改以适应不同的项目。

(0)

相关推荐

  • 一个自定义格式就能解决的事,你居然用text函数写了这么一长串

    ★ 编按 ★ Hello各位小伙伴们,相信大家对Excel中的自定义格式和Text函数一定不陌生,那你们知道Text函数的第二个参数引用的就是自定义格式代码吗?今天咱们的教程就来好好讲一讲两者的深层联 ...

  • 博途SCL实现自定义ModbusRtu Over TCP功能块

    积木式上位机怎么设计? 高质量的PLC程序应该从何入手? 如何在西门子博途中实现工艺配方? 秒懂S7-1500PLC读写SQL微软数据库 分享一组污水处理3D画面,谈谈上位机设计原则! [导读]博途提 ...

  • 百变神君Text的6个使用场景,你会几个

    与 30万 读者一起学Excel 卢子:Text一个很神奇的函数,可以将数据变化成你想看到的任何形式,有万能函数之称. 网友:万能?这么牛逼,真想好好见识下. 卢子:N年前在日企工作,经常会写一些日语 ...

  • 最高法首次发布行政协议十大典型案例

    中国网5月11日讯(记者 张艳玲)最高人民法院今日首次集中发布行政协议典型案例,为各级人民法院审理行政协议案件提供可推广可复制的审判经验,不断丰富行政协议案件审判实践积累. 行政协议是行政机关为了实现 ...

  • 明末登莱之乱时的蓬莱知县秦世英,官运不济的典型例子

    在古代,一个官员在仕途上能取得多大成就,主要取决于三方面的因素,一是出身背景,二是为官之道,第三就是"运气". 这三点当中,出身背景由先天决定,为官之道也有迹可循,总之大体都可以提 ...

  • 原创|关于工资薪金所得的典型例子

    注:规则有变,请点下面关注,一定设为星标,否则不显示更新. (1)员工获得期权激励,算工薪所得,在未来行权时确认为收入. (2)公司为每位员工提供的免费早餐或午餐,定额.人人有份.且固定标准,能分得清 ...

  • 原创|举几个常见的工资薪金所得的典型例子

    (1).员工获得期权激励,算工薪所得,在未来行权时确认为收入. (2).公司为每位员工提供的免费早餐或午餐,定额.人人有份.且固定标准,能分得清谁吃多少的,是一种变相支付工资的形式,算所得,按其金额并 ...

  • 举几个属于或不属于工资薪金所得的典型例子

    (1)员工获得期权激励,算工薪所得,在未来行权时确认为收入. (2)公司为每位员工提供的免费早餐或午餐,定额.人人有份.且固定标准,能分得清谁吃多少的,是一种变相支付工资的形式,算所得,按其金额并人月 ...

  • 高中物理常考模型概要及典型例子解析,课本中都未必能学到!

                             高中物理资料 4天前 今天王老师给大家准备了高中物理常考模型概要及典型例子解析,课本里也不一定有. 高中物理资料 一个普通高中物理教师的教学分享,每天 ...

  • 三菱FX5U自定义协议串口通信主站视频教程

    三菱FX5U做主站.串口调试助手做从站,三菱FX5U先行发送8个字节给串口调试助手,串口调试助手再返回给三菱FX5U共计8个字节,程序如此循环.视频详细讲解了RS2指令的用法. 三菱FX5U做主站.串 ...

  • 嵌入式开发中自定义协议的解析与组包

    在嵌入式产品开发中,经常会遇到两个设备之间的通信.设备与服务器的通信.设备和上位机的通信等,很多时候通信协议都是自定义的,所以就涉及到自定义协议的解析和组包问题. 比如针对下面的这样一个协议: 帧头1 ...

  • 把外来的观赏鱼放生,它能成为原生鱼吗?这种食蚊鱼就是典型例子

    随着时代的进步,人们生活水平的提高,饲养观赏鱼已成为一种时尚的观点,我国各地掀起了饲养观赏鱼的热潮. 当然,观赏鱼按地域区分的话可以分成两大种: 1.中国原生鱼[指的是中国本土鱼类] 2.外国观赏鱼[ ...