Hi Leute,
nach langer Pause wollte ich mal wieder etwas mit meinem Arduino machen ![]()
Da ich mit meinem Arduino ASCII-Text über die serielle Schnittstelle empfange und bearbeite, stellt sich mir immer wieder die Frage, ob ein char Array oder ein String in Frage kommt. Beides hat seine Vor- und Nachteile.
Laut Arduino-Referenz benötigt ein String mehr Speicher. ...aber was bedeutet das genau? Belegt ein String pauschal xx Byte mehr im RAM oder wächst dies mit der Stringlänge?
Prinzipiell habe ich gehofft, dass ich mit Strings RAM spare, da ich im gegensatz zu einem char array keine max-länge angeben muss. ....oder täusche ich mich da?
hier ist mein aktuell bescheidener Versuch:
void setup ()
{
Serial.begin(115200);
}
#define PUFFER 100
byte Segmente_aufnehmen = 0;
char Segment;
String Befehl;
String Temp;
int CRC_berechnet;
int CRC_empfangen;
int Counter;
int Index;
char CRC[4];
int Pos_a;
int Pos_b;
void loop ()
{
while (Serial.available() > 0)
{
// ein Zeichen aus dem Eingangs-Puffer lesen
Segment = Serial.read();
// den Befehls-String zusammensetzen
if (Segment == '
ich habe vor, solche Ausdrücke zu Parsen: $ACCAL,1120,895,0,D2,4220*14
Es hat den gleichen Aufbau, wie der Datenstrom des NMEA 0183-Protokolls (GPS-Daten).
... ist das sehr ineffizient programmiert? zugegeben.... ich bastel noch an diesem code.
viele Grüße,
SBond
&& Segmente_aufnehmen == 0) {
Segmente_aufnehmen = PUFFER-1;
}
else if (Segment == '
ich habe vor, solche Ausdrücke zu Parsen: `§_DISCOURSE_HOISTED_CODE_1_§`
Es hat den gleichen Aufbau, wie der Datenstrom des NMEA 0183-Protokolls (GPS-Daten).
... ist das sehr ineffizient programmiert? zugegeben.... ich bastel noch an diesem code.
viele Grüße,
SBond
&& Segmente_aufnehmen > 0) {
Segmente_aufnehmen = PUFFER-1;
Befehl="";
}
else if (Segment == '*' && Segmente_aufnehmen > 2) {
Segmente_aufnehmen = 3;
}
if (Segmente_aufnehmen > 0) {
Befehl += (char) Segment;
Segmente_aufnehmen--;
}
// der Befehl ist komplett....
if (Segmente_aufnehmen == 0 && Befehl != ""){
// CRC berechnen
Index = Befehl.indexOf('*') + 1;
Temp = Befehl.substring(Index);
Temp.toCharArray(CRC, 4);
CRC_empfangen = (int)strtol(CRC, NULL, 16);
CRC_berechnet = 0;
for (Counter = 1; Counter < Befehl.length()-3; Counter++){
CRC_berechnet ^= (int)Befehl.charAt(Counter);
}
if (CRC_empfangen == CRC_berechnet) {
Serial.println("CRC OK");
}
else {
Serial.println("CRC FEHELR");
}
Serial.println(Befehl);
Pos_a = 0;
while(Pos_a >= 0 && Pos_b >= 0) {
Pos_a = Pos_b;
Pos_b = Befehl.indexOf(',', Pos_a + 1);
if (Pos_b == -1) {
Pos_b = Befehl.indexOf('*', Pos_a + 1);
}
Serial.println(Befehl.substring(Pos_a + 1,Pos_b));
}
Befehl="";
}
}
}
ich habe vor, solche Ausdrücke zu Parsen: §_DISCOURSE_HOISTED_CODE_1_§
Es hat den gleichen Aufbau, wie der Datenstrom des NMEA 0183-Protokolls (GPS-Daten).
... ist das sehr ineffizient programmiert? zugegeben.... ich bastel noch an diesem code.
viele Grüße,
SBond