找回密码
 立即注册
查看: 156|回复: 5

求助!

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-06-03 09:09:20
已绑定手机

9

主题

61

回帖

313

积分

中级会员

积分
313
发表于 2025-4-8 12:44:43 | 显示全部楼层 |阅读模式
  1.   set_i2c_cmd(I2c0, 0, S_Tx_Rack, 0x71, Rx_Tack, &hum[0], Rx_Tack, &hum[1], Rx_Tack, &hum[2], Rx_Tack, &hum[3],Rx_Tack, &hum[4],Rx_Tack, &hum[5],Rx_Tack, &hum[6],Stop, Cmd_End);
复制代码
这是一个IIC读取AHT30温湿度传感器的代码片段,程序报错“error C187: 'set_i2c_cmd': size of actuals exceeds 'maxargs'”我减小参数倒是不报错了,但是读取不完全了,治标不治本。求解决方案

回复

使用道具 举报 送花

3

主题

721

回帖

153

积分

等待验证会员

积分
153
发表于 2025-4-8 12:53:00 | 显示全部楼层
在您提供的代码片段中,seti2ccmd函数的参数数量超出了编译器允许的最大参数数量限制,导致报错“error C187: 'seti2ccmd': size of actuals exceeds 'maxargs'”。为了解决这个问题,我们可以从以下几个方面入手:

1. 分段调用 seti2ccmd 函数
由于 seti2ccmd 函数的参数数量限制,可以将读取操作分成多个步骤进行。例如,先发送起始信号和地址,然后分多次读取数据。这样不仅解决了参数数量的问题,还能确保数据的完整性。
  1. c
  2. // 发送起始信号和地址
  3. seti2ccmd(I2c0, 0, STxRack, 0x71, CmdEnd);
  4. // 分多次读取数据
  5. seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
  6. seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
  7. seti2ccmd(I2c0, 0, RxTack, &hum, RxTack, &hum, CmdEnd);
  8. seti2ccmd(I2c0, 0, RxTack, &hum, Stop, CmdEnd);
复制代码

2. 使用数组传递参数
如果 seti2ccmd 函数支持数组作为参数,可以将参数存储在数组中,然后一次性传递给函数。这样可以减少参数的数量,同时保持代码的简洁性。
  1. c
  2. uint8t cmds[] = {
  3.     STxRack, 0x71, RxTack, &hum, RxTack, &hum, RxTack, &hum,
  4.     RxTack, &hum, RxTack, &hum, RxTack, &hum, RxTack, &hum, Stop, CmdEnd
  5. };
  6. seti2ccmd(I2c0, 0, cmds);
复制代码

3. 检查编译器设置
有些编译器允许通过修改设置来增加最大参数数量。您可以查阅编译器的文档,看看是否有相关的选项可以调整 maxargs 的值。

4. 优化 I2C 通信协议
根据 AHT30 的 datasheet,确保您的 I2C 通信协议是正确的。有时候,减少不必要的重复操作,可以有效减少参数数量。例如,如果多个连续的 RxTack 操作可以合并,可以尝试优化代码。

5. 使用宏或函数封装
如果上述方法都不适用,可以考虑使用宏或函数封装重复的操作。这样可以减少代码的冗余,同时避免参数数量超限的问题。
  1. c
  2. define READHUMIDITY() \
  3.     seti2ccmd(I2c0, 0, RxTack, &hum, CmdEnd)
  4. READHUMIDITY();
  5. READHUMIDITY();
  6. READHUMIDITY();
  7. READHUMIDITY();
  8. READHUMIDITY();
  9. READHUMIDITY();
  10. READHUMIDITY();
复制代码

总结
通过分段调用、使用数组传递参数、检查编译器设置、优化通信协议或使用宏封装等方法,可以有效解决 seti2ccmd 函数参数数量超限的问题。建议根据实际需求和硬件限制,选择最适合的解决方案。希望这些建议对您有所帮助。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6016

积分

版主

积分
6016
发表于 2025-4-8 13:04:34 | 显示全部楼层
xsmall模型下,maxargs最大为40byte ,想要调大可以在.c文件最开头使用如下指令
#pragma maxargs (100)
类似的就可以将maxargs的缓存大小调大了

同时,因为你的单条指令较长,可以调节set_i2c.h中的
#define Max_I2c_Cmd 20 // 最大指令缓存长度,如果超出,后面的就不会生效了

以防止指令缓存区溢出
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-06-03 09:09:20
已绑定手机

9

主题

61

回帖

313

积分

中级会员

积分
313
发表于 2025-4-8 17:42:12 | 显示全部楼层
王*** 发表于 2025-4-8 13:04
xsmall模型下,maxargs最大为40byte ,想要调大可以在.c文件最开头使用如下指令
#pragma maxargs (100)
类 ...

成功了,感谢大佬,还得是你。
上面那个分开写,或者直接导入数组的方式可行吗?我试了一下分开写,还是失败了。确认一下是否可行,如果可行的话我就再试试,如果不太行的话我就用你这种方法啦

点评

分开写是可以的,导入数组暂不支持。 但是分开写需要注意,要使用同一个通道,并且要等当前通道写完后再装载下一部分。 具体实现起来稍微有点麻烦,建议还是使用这种一长串的。 根据需要换换行就可以了,语句是分号  详情 回复 发表于 2025-4-8 18:07
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6016

积分

版主

积分
6016
发表于 2025-4-8 18:07:24 | 显示全部楼层
Sky_c*** 发表于 2025-4-8 17:42
成功了,感谢大佬,还得是你。
上面那个分开写,或者直接导入数组的方式可行吗?我试了一下分开写,还是 ...

分开写是可以的,导入数组暂不支持。
但是分开写需要注意,要使用同一个通道,并且要等当前通道写完后再装载下一部分。
(如果在指令执行过程中写入,当前写入就不会执行,内部有操作忙标志位,通道非空闲情况下写入是没用的)
具体实现起来稍微有点麻烦,建议还是使用这种一长串的。
根据需要换换行就可以了,语句是分号结束,参数可以任意换行

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-06-03 09:09:20
已绑定手机

9

主题

61

回帖

313

积分

中级会员

积分
313
发表于 2025-4-10 16:52:19 | 显示全部楼层
王*** 发表于 2025-4-8 18:07
分开写是可以的,导入数组暂不支持。
但是分开写需要注意,要使用同一个通道,并且要等当前通道写完后再装 ...

好的,感谢大佬*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 17:00 , Processed in 0.151019 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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