Hallo,
ich muss einen String vom Master Arduino zu einem Slave Arduino via I2C übertragen.
Mein String wird eine max erreichbare Länge von 100Zeichen bekommen können.
Da ich gelesen habe (http://www.gammon.com.au/forum/?id=10896), dass man via I2C nur 32byte in einem Durchgang übertragen kann, würde ich gerne wissen, ob ich den String in Paketen also alle zB 20 oder 30 Zeichen übertragen kann.
Wird das interne Buffer bei jedem Aufruf von Wire.beginTransmission(Adress) gelöscht?
Würde das so funktionieren?
Der nachfolgende Code ist nur ein Test, da ich keinen Stringvarialbe mit Wire.write übertragen kann, konvertiere ich den String in ein charr Array via string.toCharArray und sende dann anhand der Stringlänge ( Array Länge ) jedes Zeichen einzeln
// Übertrage die ersten 30Zeichen => 0 übertragen
Wire.beginTransmission(44); // transmit to device #44 (0x2c)
Wire.write("123456789012345678901234567890"); // Teststring mit 30Zeichen
Wire.endTransmission(); // stop transmitting
// Übertrage weitere 30 Zeichen => 30 übertragen
Wire.beginTransmission(44); // transmit to device #44 (0x2c)
Wire.write("123456789012345678901234567890"); // Teststring mit 30Zeichen
Wire.endTransmission(); // stop transmitting
// Übertrage weitere 30 Zeichen => 60 übertragen
Wire.beginTransmission(44); // transmit to device #44 (0x2c)
Wire.write("123456789012345678901234567890"); // Teststring mit 30Zeichen
Wire.endTransmission(); // stop transmitting
// Übertrage weitere 10 Zeichen => 90 übertragen
Wire.beginTransmission(44); // transmit to device #44 (0x2c)
Wire.write("123456789012345678901234567890"); // Teststring mit 30Zeichen
Wire.endTransmission(); // stop transmitting
// fertig, 100 Zeichen wurden übertragen....
so sieht derzeit mein Code aus ( in Testphase )
Mittels dtostrf konvertiere ich eine Float Variable in einen String.
Dabei hängt sich der Arduino natürlich auf.....
void sendLCD()
{
char charBuf[16];
String LCDBuf = "";
int len = 0;
//Stringübertragung ca 80Zeichen ==> Absicherung bis max 100Zeichen
//g_wind,g_richtung,g_wind30,g_wind60,g_wind180,g_vmax30,g_vmax60,g_temperature,g_humidity,g_datum,g_uhrzeit,g_BSZ_counter_std,g_BSZ_counter_min
LCDBuf = dtostrf(g_wind,4,2,charBuf);
LCDBuf += ",";
LCDBuf += g_richtung;
LCDBuf += ",";
LCDBuf += dtostrf(g_wind30,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_wind60,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_wind180,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_vmax30,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_vmax60,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_temperature,4,2,charBuf);
LCDBuf += ",";
LCDBuf += dtostrf(g_humidity,4,2,charBuf);
LCDBuf += ",";
LCDBuf += g_datum;
LCDBuf += ",";
LCDBuf += g_uhrzeit;
LCDBuf += ",";
LCDBuf += g_BSZ_counter_std;
LCDBuf += ",";
LCDBuf += g_BSZ_counter_min;
len=LCDBuf.length(); // ermittle Stringlänge
char StringBuf_h[len+1];
LCDBuf.toCharArray(StringBuf_h,len+1);
Wire.beginTransmission(4); // transmit to device #4
char str[5] = {'L','C','D','1'}; // Header Kommando damit übertragener String direkt aufs Display kommt
for (int j=0;j<4;j++)
{
Wire.write(str[j]); // sende Zeichenweise LCD, (mit Beistrich)
}
byte buffer_h[len+1]; // Übertrage string byteweise
for (int i=0;i<=len;i++) // übertrage byteweise
{
buffer_h[i] =StringBuf_h[i];
Wire.write(buffer_h[i]);
}
Wire.endTransmission();
}
lg Dieter