Ich weiß aber nicht wie ich das Ende festhalten kann, damit ich den String bestimmen kann.
#include <stdio.h>
#include <string.h>
#include <assert.h>
//fake daten für den seriellen empfang
const int SERIELL_HAPPEN = 5;
//diese pakete werden nacheinander "empfangen"
char* seriell_happen[SERIELL_HAPPEN]=
{
"11.22 Kg\r\n",
"11.33 Kg",
"\r\n22.33",
" Kg\r\n44.33 Kg\r\n",
"55.66 Kg\r\n11.23 Kg\r\n",
};
//buffer fuer die eingangsdaten
const int BUFFER_CAPACITY = 1024;
char buffer[BUFFER_CAPACITY] = {0};
int buffer_size = 0; // wir fangen bei 0 an
int main()
{
//------------------------------------
//fake des seriellen empfangs
for(int t = 0; t < SERIELL_HAPPEN; ++t)
{
char* happen_daten = seriell_happen[t];
int happen_laenge = strlen(happen_daten);
//-------------------------------------
//ist der buffer schon zu voll?
assert(buffer_size+happen_laenge < BUFFER_CAPACITY); //--> fehler
//seriellen daten an das ende des buffers kopieren
::memcpy(buffer+buffer_size, happen_daten, happen_laenge);
buffer_size = buffer_size + happen_laenge;
//-------------------------------------
//dann fertige pakete suchen
int begin = 0;
int ende = 0;
int i = 0;
while(i < buffer_size-1)
{
// stehen wir auf einem abschluss \r\n
if( buffer[i]=='\r' && buffer[i+1]=='\n' )
{
ende = i; // hier faengt das \r\n an
//ausgabe - hier dann den wert nochmal parsen nach "XX.YYYY Kg"
for(int c = begin; c < ende; ++c){ printf("%c", buffer[c]); } printf("\n");
//...[11.22 Kg[\r\n22.33
begin = i+2; // der naechste start liegt hinter \r\n
}
++i;
}
//wert(e) gefunden?
if( ende != 0 )
{
//buffer verkuerzen
int vorne_abschneiden_laenge = ende + 2; // mit \r\n
//den verarbeiteten teil mit den daten dahinter ueberschreiben
int rest_size = buffer_size - vorne_abschneiden_laenge;
::memcpy(buffer,buffer+vorne_abschneiden_laenge, rest_size);
//buffer hinter den kopierten daten "bereinigen" - nicht unbedingt noetig
::memset(buffer+rest_size, 0, vorne_abschneiden_laenge);
buffer_size = rest_size;
}
//-------------------------------------
}
return 0;
}
dass du einen 'grossen' Buffer voll mit Bytes
in diesem Falle aber für das Problem-Verständnis unrelevant ob Linear oder Circular oder whatever
Ich versuche das jetzt nochmal irgendwie zu lösen.......
Hallo,
ich hoffe mir kann jemand helfen!? Ich bin leider nicht sehr Erfahren in der Programmierung.
Ich habe über eine Serielle Schnittstelle eine Waage an meine Wago 750-880 geschlossen, welche dauerhaft das aktuelle Gewicht sendet.
Das Signal kommt bei mir an. Das Problem ist nun, dass wenn der Buffer voll ist und wieder gelöscht wird, fängt die Karte irgendwo im String an zu empfangen. Da ich das nicht richtig erklären kann, habe ich ein Screenshot vom laufenden Programm gemacht.
Ich habe erst versucht nur nach Zahlen in dem String zu suchen oder immer nach der ersten Nummer. Die Position des Gewichts ändert sich jedoch immer.
Wie kann ich einen String nach einer festen Zeichenkette durchsuchen und dann nur die Werte vor dieser Kette lesen?
Ich hoffe ihr könnt mein Problem verstehen!?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?