首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确格式化I2C (Wire.write)的数据

正确格式化I2C (Wire.write)的数据
EN

Stack Overflow用户
提问于 2018-12-28 09:39:14
回答 3查看 1.7K关注 0票数 1

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

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

初始reqNo将告诉主批将返回哪一批。例如,批处理0将模拟0- 5,批1将模拟6-11等等。

这一切都在起作用,直到深入阅读,我才找到了一篇文章,该文章提倡由于内存使用和相关问题而不使用字符串。但是,为了避免字符串的使用,我尝试重构我的代码,现在我得到了这样的字符串:

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

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

我觉得这是编码问题还是类似的?有谁能给我建议一下我做错了什么,或者用其他方法来达到这个目的?非常重要的是,设备在没有重新启动或任何问题的情况下运行很长一段时间,这就是为什么我非常热衷于删除字符串,如果这会导致问题的话。

主要代码:

代码语言:javascript
运行
复制
int i=0;
char res[32]="";
while(Wire.available()){
    char c=Wire.read();
    Serial.print(c);
    res[i]=c;
    i++;
}

奴隶代码:

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2018-12-28 10:18:29

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

代码语言:javascript
运行
复制
...
// master side
char c=Wire.read();
...
// slave side            
Wire.write(analogRead(i));

您将整型值当作是ASCII编码的,而不是。您必须在某个时候将它们转换为ASCII (例如,母版)。考虑使用sscanfsnprintf进行转换。

第二,您不是NUL终止一个C字符串。

票数 1
EN

Stack Overflow用户

发布于 2018-12-28 10:10:57

例如,Wire.write(reqNo);将编写代码0 1或2的字符,而不是字符“0”或“1”或“2”,如果这符合您的预期

票数 0
EN

Stack Overflow用户

发布于 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个字符(也算作字符),并导致缓冲区溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53956408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档