gpt4 book ai didi

c++ - 为 I2C (Wire.write) 正确格式化数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:34 24 4
gpt4 key购买 nike

我将多个 Arduino Mega 单元连接在一起,以创建一个 IO 组,所有这些单元都由 I2C 总线上的主设备控制。

我让它与从属一起工作,用模拟输入等的状态填充一个字符串,每个都用冒号分隔。然后该字符串将通过 Wire.write 进行循环。

初始的reqNo 会告诉主人哪一批被退回。例如。批处理 0 将是模拟 0 - 5,批处理 1 将是模拟 6 - 11 等。

一切正常,直到进一步阅读使我看到一篇文章,该文章因内存使用和相关问题而提倡不要使用字符串。我试图重构我的代码以避免使用字符串,但是,现在我得到这样的字符串:

:⸮:⸮:⸮:⸮:⸮:⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮W

返回的不是我预期的输出。

我认为这是编码问题或类似问题?任何人都可以就我做错了什么或实现这一目标的其他方法提供建议。非常重要的是,设备可以在很长一段时间内正常运行而不会重新启动或出现任何问题,这就是为什么我非常热衷于删除可能会导致问题的字符串。

主密码:

int i=0;
char res[32]="";
while(Wire.available()){
char c=Wire.read();
Serial.print(c);
res[i]=c;
i++;
}

从机代码:

void requestStatus(){
int i;
Wire.write(reqNo);

if(reqNo==0){
for(i=0;i<6;i++){
Wire.write(':');
Wire.write(analogRead(i));
}
}else if(reqNo==1){
for(i=6;i<12;i++){
Wire.write(':');
Wire.write(analogRead(i));
}
}else if(reqNo==2){
for(i=12;i<16;i++){
Wire.write(':');
Wire.write(analogRead(i));
}
}
reqNo++;
if(reqNo==3){
reqNo=0;
}
}

最佳答案

您的代码有两个问题,首先:

...
// master side
char c=Wire.read();
...
// slave side
Wire.write(analogRead(i));

您将整数值视为 ASCII编码,他们不是。您必须在某些时候(例如主端)将它们转换为 ASCII。考虑使用 sscanfsnprintf 进行转换。

第二,你不是NUL terminating一个 C 字符串。

关于c++ - 为 I2C (Wire.write) 正确格式化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53956408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com