硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1178|回复: 4
收起左侧

[有问必答] 数组空间浪费的问题

[复制链接]

24

主题

50

回帖

122

积分

初级会员

积分
122
发表于 2024-5-28 09:52:13 | 显示全部楼层 |阅读模式
我现在的modbus协议是这样实现的,串口发送数据01 04 10 10 00 02 74 CE,他的起始地址为0x1010,而我的代码获取起始地址为
ModBus_info.startRegAddr = (u16)ModBus_info.Modbus_Rx_Buff[2] << 8 | ModBus_info.Modbus_Rx_Buff[3];
获取到起始地址后会根据这个地址去自定义的数组的对应地址取数据,下面是实现的代码
for (u8 i = 0; i < ModBus_info.RegNum * 2; i++)
{
        ModBus_info.ModBus_Tx_Buff[3 + i * 2] = (Modbus_IO[ModBus_info.startRegAddr + i] / 256); // 先发送高字节--在发送低字节
        ModBus_info.ModBus_Tx_Buff[4 + i * 2] = (Modbus_IO[ModBus_info.startRegAddr + i] % 256); //
}
但是在起始地址0x1010前面的内容是没有用的,并且可能还没有数据,所以会造成浪费,他数组的数据就从起始地址0x1010到地址0x1025,现在就是不想设很大的数组,
怎么设置一个数组或者一个指针来实现

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-5-28 10:27:10 | 显示全部楼层
Modbus_IO数值前面的数据有用吗,如果没用到,直接去掉就行,如果用到了,可优化的空间不大。
回复

使用道具 举报

86

主题

446

回帖

724

积分

金牌会员

积分
724
QQ
发表于 2024-5-28 10:51:33 | 显示全部楼层
可以定义一个指针   uint16_t *pModbus_Table =Modbus_IO[ModBus_info.startRegAddr]   后面根据收到的地址 Addr 去访问 pModbus_Table[Addr] 里面的内容
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-5-28 11:21:10 | 显示全部楼层
我现在的方法是,设置一个uint8_t *Modbus_IO,然后用calloc分配一个空间,定义一个偏移量#define ADDR 0x1010,然后偏移后的地址为p = Modbus_IO+(ModBus_info.startRegAddr - ADDR),然后就用ModBus_info.ModBus_Tx_Buff[3 + i * 2] = (Modbus_IO[p+ i] / 256);这样不知道对不对
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2024-5-28 22:30:15 | 显示全部楼层
zhouyalong 发表于 2024-5-28 11:21
我现在的方法是,设置一个uint8_t *Modbus_IO,然后用calloc分配一个空间,定义一个偏移量#define ADDR 0x10 ...

用了calloc你这个代码就要考虑稳定性了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 16:21 , Processed in 0.039048 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表