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?
Ihre Methode funktioniert ein Vergnügen. Jetzt muss ich es nur in die Hauptskizzen einarbeiten. Vielen Dank für die Hilfe (und die Optimierung). –
@RogerMcClurg Sie sind willkommen –
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]; –