2017-02-25 316 views
2

我有多个不超过32字节的变长字符串,每个变长字符串需要通过2个Arduino Nanos之间的I2C发送。我使用#来终止每个字符串。我可以成功地发送和接收第一个字符串,但对于我的生活,我无法弄清楚如何发送后续的字符串。如何向I2C主机发送多个32字节的字符串?

String answer = "12345,123.4,50.6,12345#"; 
    String answerV = "4.10,4.15,4.13,4.05,4.18,0#"; 

主码

#include <Wire.h> 
    int esc = 0; 
    int throttle = 80;  

    void setup() { 
    Wire.begin(); 
    Serial.begin(115200); 
    Serial.println("I2C Master ready!"); 
    esc = throttle * 100/180; 
    } 

    void loop() { 
     delay(500); 
     Serial.println("Receive data"); 
     Wire.requestFrom(9,32); 
     String response = ""; 
     Serial.println(Wire.available()); 
     while (Wire.available()) 
     { 
     char b = Wire.read(); 
     response += b; 
     } 
     String dataString = response; 
     int hashIndex = dataString.indexOf('#'); 
     String SportData = dataString.substring(0, hashIndex); 
     Serial.println(SportData); 

     String SDdata = String (esc) + "," + String(SportData); 
     Serial.println(SDdata); 
    } 

从编码

#include <Wire.h> 

    byte ANSWERSIZE= 22; 

    String answer = "12345,123.4,50.6,12345#"; 
    String answerV = "4.10,4.15,4.13,4.05,4.18,0#"; 

    void setup() { 
     Wire.begin(9); 
     Wire.onRequest(requestEvent); // data request from Master 
     Serial.begin(115200); 
     Serial.println("I2C Slave ready!"); 
     ANSWERSIZE = answer.length(); 
    } 

    void requestEvent() { 
     byte response[ANSWERSIZE]; 
     for (byte i=0;i<ANSWERSIZE;i++) 
     { 
     response[i] = (byte)answer.charAt(i); 
     } 
     Wire.write(response,sizeof(response)); 
    } 

    void loop() { 
     delay(50); 
    } 

是否有人可以告诉我怎么可以这样做:我与这个样子的测试样品?

回答

1

一个简单的想法是跟踪调用次数requestEvent(),并用它来决定发送回主人


下面是代码(注:我冒昧地优化了一点)

站长:

#include <Wire.h> 

/** 
* globals 
*/ 

int esc = 0; 
int throttle = 80;  
char buffer[33]; 

/** 
* setup & loop 
*/ 

void setup() 
{ 
    Serial.begin(115200); 
    Wire.begin(); 

    esc = throttle * 100/180; 
    buffer[32] = '\0'; 

    Serial.println("I2C Master ready!"); 
} 

void loop() 
{ 
    delay(500); 

    Wire.requestFrom(9, 32); 

    for (byte i = 0; i < 32 && Wire.available(); ++i) 
    { 
     buffer[i] = Wire.read(); 

     if (buffer[i] == '#') { 
      buffer[i] = '\0'; 
      break; 
     } 
    } 

    Serial.print(esc); 
    Serial.print(','); 
    Serial.println(buffer); 
} 

奴隶:

#include <Wire.h> 

/** 
* globals 
*/ 

const byte DATA_SIZE = 2; 
String data[DATA_SIZE] = { 
    "12345,123.4,50.6,12345#", 
    "4.10,4.15,4.13,4.05,4.18,0#" 
}; 

/** 
* setup & loop 
*/ 

void setup() 
{ 
    Serial.begin(115200); 
    Wire.begin(9); 
    Wire.onRequest(requestEvent); // data request from Master 

    Serial.println("I2C Slave ready!"); 
} 

void loop() 
{ 
    delay(50); 
} 

/** 
* help functions 
*/ 

void requestEvent() 
{ 
    static byte req_number = 0; 

    Wire.write(reinterpret_cast<const unsigned char*>(data[req_number].c_str()), 
       data[req_number].length()); 

    req_number = (req_number + 1) % DATA_SIZE; 
} 

注意:我没有两个Arduino设备,所以我无法测试此代码。如果您发现一些错误,请回报并修复它们。

+0

你的方法是一种享受。现在我只需要将它写入主要草图。非常感谢帮助(和优化)。 –

+0

@RogerMcClurg不用客气 –

+0

我试图分阶段做到这一点,因为我现有的主/从很复杂。我整合了你在我的奴隶中提供的代码,并使用你提供的主人。当我使用你提供的测试数据数组时,它工作得很好。一旦我使用填充实时数据的数组,主服务器从从服务器获取第一个数组入口数据[0],但数据[1]不显示。 这里是我如何定义数组: const byte DATA_SIZE = 2; 字符串数据[DATA_SIZE]; –

相关问题