`

嵌入式设备网页控制解决方案之动态结构体与Spath

 
阅读更多

    具有网络功能的嵌入式产品的控制一般是通过发送命令完成的,命令对应的值一般分为单值命令和结构体块数据两类。举例如下:

 

/*define two commands*/
#define CMDA 0x0f
#define CMDB 0x0e

/*define a value*/
int a = 0;

/*define a struct*/
struct B{
    int b;
    int c;
    char d[4];
}b;

/*send CMDA with a single value*/
send(CMDA, &a, sizeof(int));

/*sendCMDB with struct data*/
send(CMDB, &b, sizeof(struct B));

 

 

如果我们要设计一个网页控制系统,需要满足以下需求:

    需求1:网页上的控件与设备里面的参数一一对应,无论是单值还是结构体中的成员;

    具体情况如下:

 

/*
假设网页上有一个输入框,它绑定一个命令号,如果该命令号是单值,直接绑定该值;
如果该命令号是个结构体,我们需要寻求一种方法将结构体成员与该网页控件对应,更改该控件的值就可以直接反应到结构体的成员中。
*/

 在这里,我把我设计的解决方案分享一下。

 

    首先,指定结构体中的成员变量,我采用了类似Xpath的概念,此处我就把它简称为Spath(Struct member  path),与Xpath相区别。

    那么Spath是怎么样指定结构体中的成员的呢?

    以前面结构体B为例,Spath举例如下:

/*represent member b*/
/B/b


/*represent member c*/
/B/c


/*represent member d*/
/B/d

 以/开始紧跟结构体名,直到最终成员结束。

此时,我们可以用cmd和Spath区别开不同的结构体成员了,如果我们将cmd和Spath提交给CGI程序处理,/B/c这个Spath指定了结构体的第二个成员变量,那么我们可以更新或者读取B结构体二进制数据中的对应的值。但是,这一过程是人工去判断的,具体说是CGI编程人员去判断的,那么这个工作量是相当大的,而且如果结构体变化,CGI也会修改并重新编译。一点都不灵活。

   为了优化这个过程,使全程自动化,我引入了动态结构体的概念。

   什么是动态结构体?

   

/*
简单点说,动态结构体的成员是在运行时确定的,不是在编译时确定的。我们都知道C/C++结构体都是声明后在编译时内存大小和成员位置就已经确定好了,我们不能在运行时去动态的为结构体添加一个成员,当然开辟一块新内存去操作也是可以做到的,这个办法不在此次讨论之内。我这里说的动态结构体就是可以在运行时增删改查结构体成员。
*/

   动态结构体的原理是什么?

/*动态结构体的核心是一个hash表,将结构体的成员名字,类型定义到一个配置文件中,我选择的是json格式。
{
“B”:[
    {"name":"b","type":"int"},
    {"name":"c","type":"int"},
    {"name":"d","type":"array","subtype":"char","length":4}
]

}
注意:这里结构体定义需要按照成员的顺序定义
运行时,程序读取配置,将配置信息存在hash表中,生成结构体,这时解析Spath就可以找到对应成员在结构体中的位置。即使结构体更改,也不用重新编译程序,更改结构体配置文件就可以。
*/

 

 

 

分享到:
评论

相关推荐

    嵌入式linux中字符设备的cdev结构体

    ### 嵌入式Linux中字符设备的Cdev结构体详解 #### 一、引言 在嵌入式Linux系统中,字符设备是常见的设备类型之一,它通过一系列的文件操作来实现数据交互。为了更好地管理和操作这些字符设备,Linux内核引入了一个...

    网络编程之发送结构体.zip

    网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体...

    嵌入式Linux设备驱动程序开发.pdf

    嵌入式Linux设备驱动程序是指在嵌入式系统中使用的设备驱动程序,它是内核用于完成对物理设备的控制操作的功能模块。设备驱动程序在Linux内核中占有极其重要的位置,它是内核用于完成对物理设备的控制操作的功能模块...

    socket传输结构体的解决办法

    在这个解决方案中,我们使用了结构体来存储需要传输的数据,然后将结构体转换成字符串发送。在接收端,我们将字符串转换回原来的结构体。这是一个简单而有效的解决方案。 在实际实现中,我们需要注意缓存的清空,...

    13 结构体与共同体

    在编程语言中,结构体(Struct)和共同体(Union)是两种重要的数据类型,它们用于组织和管理多个相关的数据项。在本章中,我们将深入探讨C语言中的结构体和共同体,以及它们在实际编程中的应用。 首先,我们来看...

    Linux运维-嵌入式物联网开发教程-指针管理结构体.mp4

    Linux运维-嵌入式物联网开发教程-指针管理结构体.mp4

    嵌入式实习-day4-结构体、文件IO与进程

    ### 结构体 在计算机编程领域,特别是C语言中,**结构体**(Struct)是一种复合数据类型,允许程序员定义一种新的数据类型,该类型能够包含不同类型的多个成员。这种特性使得结构体非常适合用来描述复杂的数据对象,...

    Linux运维-嵌入式物联网开发教程-结构体与指针.mp4

    Linux运维-嵌入式物联网开发教程-结构体与指针.mp4

    系统结构体

    在嵌入式系统中,C语言的结构体被用来定义硬件抽象层(HAL),以便于硬件与软件之间的交互。例如,在处理SPI或I2C总线时,可以创建结构体来封装通信参数和操作函数。此外,结构体也被用于实现链表、队列和其他数据...

    第8讲-结构体与结构体数组

    讲解区分结构体与结构体数组:结构体的引出、结构体变量的定义和引用、结构体数组

    C#调用C++动态库,执行回调函数并传递结构体参数

    在IT领域,跨语言通信是常见的需求之一,尤其是在C#和C++的混合编程中。本文将详细探讨如何在C#中调用C++编写的动态链接库(DLL),执行回调函数并传递结构体参数。这涉及到.NET Framework的P/Invoke(Platform ...

    CODESYS之结构体的使用.doc

    结构体在CODESYS中的应用广泛,无论是设备驱动、控制系统逻辑还是数据交换,都能看到其身影。熟练掌握结构体的使用,能够显著提升代码的可读性、可维护性和复用性,是每个CODESYS开发者必备的技能之一。通过结构体,...

    蓝桥杯嵌入式模拟试题“模拟升降控制器”.zip

    标题中的“蓝桥杯嵌入式模拟试题‘模拟升降控制器’.zip”表明这是一个与蓝桥杯竞赛相关的嵌入式系统模拟试题,具体是关于模拟升降控制器的设计或实现。蓝桥杯是一项全国性的信息技术竞赛,其中嵌入式部分通常涉及微...

    结构体使用详解,与结构体如何嵌套使用

    联合(union)与结构体类似,但是它所有的成员共享同一段内存空间。当一个结构体中包含联合时,可以通过多种方式访问联合中的成员变量。 ##### (1) 联合成员变量的直接访问 如果联合中的成员是基本数据类型,则...

    C语言结构体与共用体

    C语言结构体与共用体 C语言中结构体是一种构造数据类型,用途是把不同类型的数据组合成一个整体。结构体类型定义描述结构的组织形式,不分配内存。结构体类型定义的作用域是全局的或局部的,视定义的位置而定。 ...

    结构体嵌套(c语言)

    在C语言中,结构体(struct)...在嵌入式编程中,它常用于表示硬件寄存器布局、设备驱动接口或层次化数据模型。通过理解并熟练运用结构体嵌套,程序员可以更好地设计和管理程序中的数据,提高代码的可读性和可维护性。

    13 结构体与共同体实验

    在本实验“13 结构体与共同体实验”中,我们将深入理解这两种数据结构的用法、特点以及它们在实际编程中的应用。 首先,结构体是C语言中用于聚合不同类型数据的一种方式。通过结构体,我们可以创建一个新的自定义...

    数据结构: 结构体与链表ppt

    重点阐述数据结构: 结构体与链表,深入详解数据结构。

    C# 结构体与数组转换,结构体成员支持数组类型

    C#实现结构体与数组间的转换,包括:同时支持大小端;支持自定义数据类型;支持数组类型结构体成员,带单元测试

    嵌入式Linux设备驱动开发详解光盘实例代码.rar

    《嵌入式Linux设备驱动开发详解》是一本深入探讨嵌入式系统中Linux设备驱动程序设计与实现的专业书籍。光盘实例代码是该书的重要补充,提供了丰富的实践案例,帮助读者更好地理解和掌握理论知识。 在嵌入式系统中,...

Global site tag (gtag.js) - Google Analytics