2017-02-25 4 views
2

Ich habe mehrere Strings mit variabler Länge, die nicht mehr als 32 Bytes, die über I2C zwischen 2 Arduino Nanos gesendet werden müssen. Ich benutze #, um jede Zeichenkette zu beenden. Ich kann die erste Zeichenfolge erfolgreich senden und empfangen, aber für das Leben von mir kann ich nicht herausfinden, wie die folgenden Zeichenfolgen gesendet werden. Die Proben ich so mit Blick mich entschieden:Wie sende ich mehrere 32-Byte-Strings an I2C-Master?

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

Mastercode

#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); 
    } 

Slave-Code

#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); 
    } 

Kann mir jemand bitte zeigen, wie dies getan werden kann?

Antwort

1

Eine einfache Idee ist es, zu verfolgen, wie oft requestEvent() aufgerufen wird, und damit zu entscheiden, was an den Master zurück gesendet werden soll. Hier


ist der Code (nb ich mir die Freiheit nahm, es zu optimieren ein wenig):

Master:

#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); 
} 

Slave:

#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; 
} 

Hinweis: Ich habe nicht zwei Arduino-Geräte, also konnte ich diesen Code nicht testen. Wenn Sie einige Fehler entdecken, melden Sie sich zurück und ich werde sie beheben.

+0

Ihre Methode funktioniert ein Vergnügen. Jetzt muss ich es nur in die Hauptskizzen einarbeiten. Vielen Dank für die Hilfe (und die Optimierung). –

+0

@RogerMcClurg Sie sind willkommen –

+0

Ich versuche, dies in Etappen zu tun, wie meine bestehenden Master/Slave wirklich kompliziert sind. Ich habe den Code, den du in meinem Slave zur Verfügung gestellt hast, übernommen und den Master benutzt, den du zur Verfügung gestellt hast. Wenn ich das Testdaten-Array verwende, das Sie zur Verfügung gestellt haben, funktioniert es gut. Sobald ich ein Array verwende, das ich mit Echtzeitdaten fülle, erhält der Master die ersten Array-Eintragsdaten [0] vom Slave, aber Daten [1] werden nicht angezeigt. So habe ich das Array definiert: const Byte DATA_SIZE = 2; String-Daten [DATA_SIZE]; –

Verwandte Themen