我将多个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;
}
}
发布于 2018-12-28 10:18:29
发布于 2018-12-28 10:10:57
例如,Wire.write(reqNo);
将编写代码0 1或2的字符,而不是字符“0”或“1”或“2”,如果这符合您的预期
发布于 2018-12-28 17:18:04
这一切都在起作用,直到深入阅读,我才找到了一篇文章,该文章提倡由于内存使用和相关问题而不使用字符串。
我猜想它是在谈论String
对象,而不是c-字符串(以nul结尾的char数组)。
它们使用动态内存分配并导致堆碎片。C-字符串通常是静态分配的(char res[32];
),如果它们是在函数中定义的,则可以从堆栈中清除它们。
write
只接受一个字节,一个具有显式长度或c-字符串的字节数组(或字符)。
将其传递给int只会将其转换为一个字节,并且只保留较低的8位。
你需要的是·print·方法。它动态地将整数转换为字符。它不使用String
或c-字符串。
您应该将所有的Wire.write
替换为Wire.print
。
在您的主代码中,您也不会终止res
char数组,这会导致问题,因为字符串没有明确的结束。您还应该确保不超过31个字符(也算作字符),并导致缓冲区溢出。
https://stackoverflow.com/questions/53956408
复制相似问题