Datei öffnen, Zeilenweise sortiert an UART senden



  • Hallo miteinander.

    In der Schule sind wir dabei ein kleines Frame-Protokoll für einen MCU zu entwerfen (momentan nur auf der MCU Seite). Und jetzt, wollte ich schon mal ein wenig zu Testzwecken Daten senden können.

    Das Ansprechen der UART ist nicht das Problem sondern, dass ich eine .txt Datei zum Projekt hinzufügen kann, und in dieser sind irgendwelche Werte (8Bit-32Bit in Dez), die jeweils mit einem ',' getrennt sind. Pro Zeile können sich beliebig viele Werte befinden, aber zum Anfang dachte ich an 2 Werte.
    Die Datei kann auch beliebig viele Zeilen haben.

    Hab bis jetzt ausser C noch ein wenig PHP erfahrung und in der Schule sind wir dabei uns ins C++ einzuarbeiten.

    beim PHP ist dies nicht so ein Problem:

    function cmpdatum($a,$b){
    	if($a['datum']  == $b['datum']) return 0;
    	return ($a['datum'] > $b['datum']) ? 1 : -1;
    }
    
    $daten = file("unterseiten/agenda.txt");
    $daten = array_reverse($daten);
    
    $stop = count($daten);
    $trenner = "\t";
    $anzeige = 4; 														// bis welchem event soll gelistet werden
    
    for($i = 0; $i < $stop; $i++){
    	$werte = explode($trenner,$daten[$i]);
    
    	$datum = explode(".",$werte[1]);
    	$datum1 = mktime(0,0,0,$datum[1],$datum[0],$datum[2]); 			// in ein ordentliches php-datum umwandeln
    
    	if($datum1 >= mktime(0,0,0,date("m"),date("d"),date("Y"))){
    		$wert[$i]['event'] = $werte[0];
    		$wert[$i]['datum'] = $datum1;
    		$wert[$i]['datumswert'] = $werte[1];
    		$wert[$i]['eintrag'] = $werte[2];
    		$wert[$i]['wo'] = $werte[3];
    	} 
    }
    
    usort($wert,"cmpdatum");
    

    jetzt ist die Frage, wie kann ich dies in C++ realisieren??

    ich hatte an etwa so einen Ablauf gedacht:

    int anzahl_enq = 0;
    int Zeile = 0;
    for(Zeile=0;Zeile<=maxZeile;Zeile++){
    	file.open("test.txt", ios::in);
    	temp_buf = file.getline(Zeile);
    	/*
    	Werte in 8-Bit Werte zerlegen und Anzahl Bytes = NUM
    	*/
    	do{
    		ComWrite(COM1,ENQ);
    		anzahl_enq ++;
    	}
    	while((ACK != COMRead(COM1)) && (anzahl_enq <= 10));
    	if(ACK == ComRead(COM1){
    		ComWrite(COM1,SOH);
    		do{
    			ComWrite(COM1,Comands);
    			ComWrite(COM1,NUM);
    			/*
    			Werte senden
    			*/
    			ComWrite(COM1,generateCRC(/*CRC vom Comands an*/);
    		}
    		while(ComRead(COM1) != ACK);
    		/*
    		Ev. Antwort abwarten im Format:
    		NUM | Paramters | CRC
    		*/
    		ComWrite(COM1,ACK);
    		ComWrite(COM1,EOT);
    	}
    	else{
    		richTextBoxMessage->AppendText("Gerät antwortet nicht\r\n");
    	}
    }
    

    PC sendet ENQ, MCU antwortet mit ACK. PC sendet SOH, Steuerkommandos für den MCU, Anzahl zu übertragender Nutzdatenbytes, CRC(generiert aus Komando,Anzahl Bytes, und den Paramtern). Falls die CRC richtig ist sendet der MCU ein ACK. Wenn nicht, wird vom Kommando aus alles nochmals gesendet. Abhängig vom Kommando sentet der MCU jetzt eine Antwort angefangen mit Anzahl Werte, dann die Parameter und zum Schluss die CRC (generiert aus der ganzen Antwort). Falls die CRC stimmt, sendet der PC ein ACK ansonsten ein NAK, worauf er die Antwort nochmals erhält. Bei einem ACK antwortet der MCU ebenfalls mit einem ACK und der PC quitiert mit EOT.

    Jetzt ist die Frage, gibts so etwas schon als Klasse??
    und wenn nicht, wie realisiere ich dies möglichst "Normenkonform" denn ich denke nicht, dass Windows es gerne hat, wenn so viele while- und for-Schlaufen in einem Programm sind.

    Danke für die Hilfe.
    MFG
    P51D



  • Kann mir niemand helfen???

    ich habe mich in der Zwischenzeit selber etwas schlau gemacht im Netz und bin auf volgende Funktionen gestossen, die vielleicht nützlich sind.

    eof()
    .getline()
    split()

    hoffe auf ein wenig Hilfe...

    MFG
    P51D



  • P51D schrieb:

    Hallo miteinander.
    ...denn ich denke nicht, dass Windows es gerne hat, wenn so viele while- und for-Schlaufen in einem Programm sind.

    Was sollte Windows daran stören? Das schlimmste das passieren kann ist, das dein Programm ineffizient ist und lange braucht.

    Lese da keine gezielte Frage raus und schreib mal ins Blaue hinein 🙂
    Viele Funktionen aus PHP wirst du nicht so ohne weiteres in C++ finden - nur durch externe libs. Gerade das String handling ist wohl etwas komplizierter. Schau dir mal http://www.cplusplus.com/reference/string/string/ an (z.B. Methoden find, substr).

    Edit:
    die Datei könntest du so einlesen

    string s;
    while(getline(file,s))
    {
    ...
    }
    


  • ihoernchen schrieb:

    Lese da keine gezielte Frage raus und schreib mal ins Blaue hinein 🙂
    Viele Funktionen aus PHP wirst du nicht so ohne weiteres in C++ finden - nur durch externe libs.
    [/code]

    vielleicht war die Frage nicht ganz klar gestellt:
    wie lese ich eine muster.txt Datei in das Programm ein und trenne die Werte??
    Die Datei kann so aussehen:

    0,0,1025,2045,
    5,1,512,4095,
    10,1,3,1,
    ..
    ...

    =>
    sollte im Programm in 2, 3 Arrays aufgeteilt werden:

    delay[]={0,5,10,.....};                  // Deley zwischen den Frames
    green_state[]={0,1,1,...};               // On oder Off
    X_Achse[]={1025,512,3,...};
    Y_Achse[]={2045,4095,1,...};
    

    damit ich dann die Delay-Werte verwenden kann, um die Aktualisierung des MCU's zu steuern und die Achsenwerte um das Display anzusteuern.

    aber danke erstmals für die Hilfe.


Anmelden zum Antworten