SBond:
...aber es kann ja nur besser werden
Habe Dir mal was aufgeschrieben, nur mit char-Array und char-Pointern.
Dabei bin ich mal davon ausgegangen, dass am Zeilenende ein ASCII-13 ("CR") gesendet wird:
void setup() {
Serial.begin(115200);
}
char* SerialStringRead()
{
static char text[81];
static byte charcount=0;
if (!Serial.available()) return NULL;
if (charcount==0) memset(text,0,sizeof(text));
char c=Serial.read();
if (c>=32 && charcount<sizeof(text)-1)
{
text[charcount]=c;
charcount++;
}
else if (c==13)
{
charcount=0;
return text;
}
return NULL;
}
void Auswertung(char* text)
{
// char text[]="$ACCAL,1120,895,0,D2,4220*14";
int CRC_empfangen, CRC_berechnet=0;
char* searchPtr=strchr(text,'*');
if (searchPtr!=NULL)
{
CRC_empfangen=strtol(searchPtr+1, NULL, 16);
for (int i=1;i<searchPtr-text;i++) CRC_berechnet^= (int)text[i];
}
else CRC_empfangen=-1; // no crc in string
if (CRC_empfangen==CRC_berechnet) // fehlerfrei empfangen
{
Serial.println(F("CRC OK"));
searchPtr=strtok(text,",*");
while (searchPtr!=NULL)
{
Serial.println(searchPtr);
searchPtr=strtok(NULL,",*");
}
}
else
{
Serial.print(F("CRC falsch: "));
Serial.println(text);
}
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void loop()
{
char* strPtr=SerialStringRead();
if (strPtr!=NULL)
{
Auswertung(strPtr);
Serial.print(F("RAM frei: "));
Serial.println(freeRam());
}
}
Die freeRam-Funktion gibt am Ende noch den freien Speicher aus.
Du kannst ja mal spaßeshalber in Deinen Code auch noch die freeRam-Funktion einbauen und vergleichen.