modbus通过reg获取各种数值。
reg地址和实际变量不一定是能对应上,
可能:reg地址是连续的,变量是分散
需要:将分散的数据映射到一个数组
USHORT *MODBUS_REG_MAP[] =
{
/*0x0AE0*/ (USHORT *) &S_RealTimeData.m_Tn, (USHORT *) &S_RealTimeData.m_MainBat,
/*0x0AE2*/ (USHORT *) &S_RealTimeData.m_UltraBat, (USHORT *) &S_RealTimeData.m_ValveBat,
/*0x0AE4*/ (USHORT *) &S_RealTimeData.m_Qm+1, (USHORT *) &S_RealTimeData.m_Qm,
/*0x0AE6*/ (USHORT *) &S_RealTimeData.m_Qb+1, (USHORT *) &S_RealTimeData.m_Qb,
/*0x0AE8*/ (USHORT *) &S_RealTimeData.m_Pn+1, (USHORT *) &S_RealTimeData.m_Pn,
/*0x0AEA*/ (USHORT *) &S_RealTimeData.m_Zb+1, (USHORT *) &S_RealTimeData.m_Zb,
/*0x0AEC*/ (USHORT *) &S_RealTimeData.m_Zm+1, (USHORT *) &S_RealTimeData.m_Zm,
/*0x0AEE*/ (USHORT *) &S_RealTimeData.m_Cn+1, (USHORT *) &S_RealTimeData.m_Cn,
/*0x0AF0*/ (USHORT *) &S_RealTimeData.m_Vm+3, (USHORT *) &S_RealTimeData.m_Vm+2, (USHORT *) &S_RealTimeData.m_Vm+1, (USHORT *) &S_RealTimeData.m_Vm,
/*0x0AF4*/ (USHORT *) &S_RealTimeData.m_Vb+3, (USHORT *) &S_RealTimeData.m_Vb+2, (USHORT *) &S_RealTimeData.m_Vb+1, (USHORT *) &S_RealTimeData.m_Vb+0,
/*0x0AF8*/ (USHORT *) &S_RealTimeData.m_Abnormal+1, (USHORT *) &S_RealTimeData.m_Abnormal,
};
也可以通过映射调整modbus传输字序大小端。
uint16_t *reg[] = {&a, &b, &c, &d};
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//将abcd值映射到*reg[]数组中
int main() {
uint16_t i, a = 10, b = 20, c = 30, d = 40;
uint16_t *reg[] = {&a, &b, &c, &d}; // 指针数组,存储变量的地址
// 通过指针数组访问变量的值
for ( i = 0; i < 4; i++) {
printf("Value of reg[%d] = %d\n", i, *reg[i] );
}
// 更新变量的值
*reg[0] = 100;
*reg[1] = 200;
*reg[2] = 300;
*reg[3] = 400;
// 再次通过指针数组访问变量的值
for ( i = 0; i < 4; i++) {
printf("Updated value of reg[%u] = %d\n", i, *reg[i]);
}
return 0;
}
C语言中,将变量的地址存储到指针数组中是一种常见的技术,用途:
-
批量操作:如果需要对多个变量执行相同的操作,可以将这些变量的地址存储到一个数组中,然后通过循环来遍历数组,对每个地址指向的变量执行操作。
-
函数参数:在某些情况下,你可能需要将多个变量的地址作为参数传递给函数。使用指针数组可以方便地实现这一点。
-
内存映射:在嵌入式编程中,经常需要操作硬件寄存器,这些寄存器通常通过内存映射的方式访问。将寄存器的地址存储在数组中,可以方便地通过数组索引来访问不同的寄存器。
-
排序和搜索:如果你需要根据变量的值进行排序或搜索,可以利用指针数组和相应的算法来实现。
-
多维数组模拟:在某些情况下,指针数组可以用来模拟多维数组的行为,尤其是在处理不规则数据结构时。
-
动态内存管理:在需要动态分配和释放内存的场景中,指针数组可以用来跟踪分配的内存块的地址。
-
回调函数:在某些设计模式中,例如观察者模式,指针数组可以用来存储回调函数的地址,以便在特定事件发生时调用它们。
-
配置和参数化:在需要根据不同配置或参数执行不同操作的程序中,指针数组可以用来存储配置参数的地址,以便在程序运行时动态地读取和设置参数。
总的来说,指针数组提供了一种灵活的方式来访问和操作内存中的变量,这在需要高效地处理大量数据或与硬件交互的程序中尤其有用。