历史上的今天
返回首页

历史上的今天

今天是:2025年08月10日(星期日)

正在发生

2021年08月10日 | STM32 | 分享自定义协议的一些典型例子

2021-08-10 来源:eefocus

上次分享的《分享一个很酷的上位机软件》中,有如下协议:

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


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


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


什么是协议?

协议这个概念我觉得挺杂的。就像嵌入式的概念一样,说法不一,比如大家常常争论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数据可阅读:

  • 《基于Linux、C、JOSN、Socket的编程实例(附代码)》

  • 《一个超轻量级的JSON解析器》

  • 《JSON的简单认识》

我们制定的协议如:

相应的解析及结果:

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


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

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

推荐阅读

史海拾趣

G-Link Technology公司的发展小趣事

面对日益多样化的市场需求,蜂鸟无线敏锐地意识到定制化服务的重要性。公司开始提供根据客户需求量身定制的无线通信解决方案,这一举措迅速赢得了众多企业和个人的青睐。例如,某大型互联网公司需要为其全球分支机构部署稳定可靠的无线通信网络,蜂鸟无线凭借其在全球范围内的研发和销售网络,迅速响应并提供了个性化的解决方案,不仅满足了客户对通信质量的高要求,还大大缩短了项目周期,赢得了客户的高度赞誉。

Digital公司的发展小趣事

DIALIGHT公司一直专注于工业LED照明领域的发展。他们深入了解工业空间照明的需求和挑战,设计了一系列专为工业应用而定制的LED照明产品。这些产品不仅易于安装和维护,而且能在恶劣的环境下持续使用。此外,DIALIGHT还提供集成系统解决方案,帮助客户降低能源成本、维护成本和碳足迹,同时提高设施的安全性和生产力。通过不断创新和优质服务,DIALIGHT在工业LED照明领域赢得了广泛的认可和信赖。

Eris Technology Corp公司的发展小趣事

在当今日新月异的科技时代,Eris Tech始终坚持以创新驱动为发展动力。公司不断加大研发投入力度,积极引进新技术、新材料和新工艺,推动产品升级和产业升级。同时,Eris Tech还注重人才培养和团队建设,吸引了一批高素质的人才加入公司。随着技术的不断创新和人才的不断积累,Eris Tech将在未来电子行业中继续发挥重要作用。

请注意,以上故事为虚构内容,旨在展示Eris Technology Corp公司可能的发展路径和成就。实际情况可能因市场变化、技术演进和公司策略调整而有所不同。

台湾肯尼威(CANNYWELL)公司的发展小趣事

面对不断变化的市场需求和技术环境,肯尼威始终坚持以创新为引领。公司不断投入研发资源,推出了一系列具有创新性的产品。例如,针对特殊需求的客户,公司推出了定制化的电源滤波器解决方案;同时,还开发了新型的三相电源滤波器等产品,满足了市场的多样化需求。这些创新不仅提升了公司的技术实力,也为公司赢得了更多的市场份额。

Hendon Semiconductors公司的发展小趣事

随着全球化进程的加速和国际贸易的不断发展,Hendon Semiconductors积极实施全球化战略,不断拓展国际市场。公司加强与国际客户的合作与交流,了解他们的需求和期望,并根据市场变化调整产品结构和市场策略。同时,Hendon Semiconductors还积极参与国际展会和技术交流活动,展示其最新的技术和产品成果,提升品牌知名度和影响力。通过一系列有效的市场拓展措施和全球化战略的实施,Hendon Semiconductors在国际市场上取得了显著的成绩和突破。

Eby Electro Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,Eby Electro Inc开始寻求拓展国际市场。公司积极参加国际电子产品展览,与国际知名企业建立合作关系,将产品销往全球各地。在国际市场的竞争中,Eby Electro Inc凭借卓越的产品质量和良好的售后服务,赢得了客户的信赖和好评。同时,公司也积极学习国际先进的管理经验和技术,不断提升自身的竞争力。

问答坊 | AI 解惑

什么是工艺?半导体集成电路是怎么制造的?

什么是工艺?半导体集成电路是怎么制造的?…

查看全部问答>

ads报错了,大哥们帮帮我呀!

Error   : L6286E: Value(0xbffff70) out of range(0 - 0xfff) for relocation #2 (wrt symbol Image$$ZI$$Limit) in init.o(init) ================================================================================ Memory Map o ...…

查看全部问答>

lwIP应用问题

最近在做lwIP,看了DATA SHEET,但是没发现ARP协议,所有就有个疑问:lwIP怎么识别IP地址,更具体的说,上位机怎么通过lwIP修改下位机的IP地址? 另外,对DATA SHEET种提到的操作系统抽象层不是太理解,它实现什么功能?…

查看全部问答>

USB ReadFile 出错怎么处理?

我用VC 写USB的应用程序时,发现用ReadFile 有时会出现1167的错误,大家有没有遇到这种情况?怎么处理呢?…

查看全部问答>

用c#实现windowmobile5的蓝牙打印功能,强人给个思路,谢谢

具体情况是这样的。要求用VS2005的C#编写一个window mobile5上的软件,要求实现这样的功能,用蓝牙连接一台同样有蓝牙功能的打印机,并打印该系统上指定的文件或内容。打印机是CMP-10BT http://www.citizen-systems.co.jp/english/printer/tps/c ...…

查看全部问答>

非常棒的国外开关电源设计软件!

非常棒的国外开关电源设计软件!自从有了它,我的设计工作变得轻松了许多!…

查看全部问答>

袖珍式瓦斯报警器

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 …

查看全部问答>

Y版本有问题吧?

今天弄了10pY版本的STM32F103C8T6,焊了4p,只有2p可以正常isp,这2p中有1p的一个IO口不稳定(芯片内无程序,外接100K上拉,信号不稳定)。以前用Z版本做过5p,重来没有发现过这些问题。又从原来的PCB上焊了1pZ版本的芯片,焊在最新的PCB上,结 ...…

查看全部问答>

新手讨教求版主主!

Crotex系列的ARM推广了多久? 其仿真器是什么,容易买的到吗? 我看了一下STM32F101R8,其内核是ARM Cortex-M3,其在市场上的应用比较广吗?仿真器怎么样??其里面好像没有CAN ???那个有CAN ?? 其ADC的速度能达到多少??…

查看全部问答>

三段式描述串口发送程序

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; --LIBRARY ALTERA;--USE ALTERA.MAXPLUS2.ALL; LIBRARY LPM;USE LPM.LPM_COMPONENTS.ALL; ENTITY Uart_Tx ISGENERIC(Tx_D_Width : PO ...…

查看全部问答>