Variable in Bascom zerlegen

Gast #1604603
Ich habe die Suche bemüht aber nichts passendes gefunden :-(


Ich Schicke über ein RS232 Wandler ein ASCI Code an mein Atmega8 der wie 
folgt aussieht:

123:132:22:1


es sind immer 4 zahlen die durch ein : voneinander getrennt sind, die 
zahlen sind unterschiedlich groß von 0-9999 sind alles dabei

Speichern tu ich sie in einer  String * 15 Variable

wie kann aber ich nun diese Zahlen Kette in 4 variablen Zerlegen das in 
jeder Variable eine von diesen Zahlenblock drinne steht?
#1604613
Mit der Instring-Funktion nach ":" suchen und anhand der gefundenen 
Positionen mit der Midstring-Funktion die Fragmente heraustrennen. Dann 
mit der Value-Funktion Zahlen (Integer, Word) daraus machen. Das wird 
aber vermutlich allerhand Flash belegen und Rechenzeit kosten.

...
Gast #1604623
mm.. rechenzeit ist schlecht, das programm ist algemein schon aufwendig 
und langsam :-(

somal ich nicht nur eine vond iese zahlenketten habe sondern vielelicth 
auch mal 30,40,50

dann ist es vielleicht besser das ich die zahlen einzeln über die 
schnittstelle schicke als in solsch ein block
#1604644
Manchmal ist es besser, auf vorgefertigte Bascom-Funktionen zu 
verzichten und das Problem auf Art des ASM-Programmierers zu lösen. Also 
mittels UART-RX-Interrupt einzelne Bytes in einen Buffer (Array) 
einlesen, dabei das letzte (neueste) Zeichen auf Trennzeichen prüfen 
(":", CR) und bei Auftreten des Trennzeichens das bisher Empfangene 
kopieren (und entwerten) und von der Mainloop zur Zahl formen zu lassen.

Interessant wäre vielleicht auch noch, den PC die Zahlen mit 
Führungsnullen senden zu lassen, so dass alle Zahlen die gleiche Anzahl 
Stellen haben. Dann könntest Du vllt. mit Overlay auf die einzelnen 
Abschnitte zugreifen.

...
#1604652
Ich kann zwar kein BASCOM

aber hier eine Loesung wie ich sie in 'C' machen wuerde


int  Value[4];
int  n;

// Value auf 0 setzen
for(n=0;n < 4;n++) Value[n] = 0;

// Alle Zeichen des String testen auf Ziffer oder ':'
n = 0;
while (*Str)
{
   if(isdigit(*Str)) Value[n] = Value[n] * 10 + (*Str-'0');
   if(*Str == ':') n++;
   Str++;
   if(n >= 4) break;
}

Deine Werte stehen anschliessend in Value[0],Value[1] ....

Gruss Helmi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.