ReadFile Zeigt nicht alle Zeichen an



  • Ich möchte Daten über die RS232 Auslesen:

    ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL);
    ........
    	//InString[dwRead] = '\0'; 
    
    		sprintf(t,TEXT("RxD (%d Byte(s)): %s"), dwRead, InString);
              	MessageBox(NULL,t,"Read",0);
    

    Rauskommen sollte:
    .E.ýàÐ...~ASN;
    Die MessageBox zeigt mir nur ].E.ýàÐ
    dwRead sagt aber 15 Bytes

    habe bei InString char, unsigned char; und TCHAR versucht..erfolglos



  • Wenn ReadFile() das von sich behauptet, wird es schon alle Zeichen gelesen haben - aber (s)printf() arbeitet auf nullterminierten Strings und gibt deshalb nur bis zum ersten '\0' aus.



  • Mit welchem Befehl kann ich das verhindern ?



  • Gar nicht - und selbst wenn, dürfte spätestens der MessageBox() Aufruf das \0 als Stringende betrachten. Du könntest höchstens alle nicht-darstellbaren Zeichen in deinen Daten durch einen Platzhalter ersetzen.



  • So sollte ReadFile aussehen (HEX)
    02 FD E0 D0 00 00 06 7E 4F 4B 3B 0D 0A 91

    Anscheinend schneidet Readfile ab den 0ern ab.
    02 FD E0 D0 00 00 06 7E 4F 4B 3B 0D 0A 91
    obwohl dwRead 14 Bytes angibt.
    Wo sind diese "Zeichen" ? 😕
    bzw welche möglichkeit gibt es, mir alle Zeichen anzuzeigen.



  • Wie gesagt schneidet ReadFile nix ab sondern deine Ausgabefunktionen weil diese alle mit Nullterminierten Strings arbeiten.
    Du könntest mal das Probieren

    ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL);
    for(int i = 0; i < dwRead; i++)
    printf("%c", InString[i]);
    

    Das gibt ja jedes Zeichen einzeln aus. Ansonsten beherzige den Tipp von CStoll.

    schirrmie



  • Ich bekomme mit folgendem Code die Zeichen einzeln heraus:

    for (int i=0;dwRead>0;i++)
    {
    		ReadFile (hCom, &wpString, 1, &dwRead, NULL);
    
    		wpString[dwRead]='\0';
    
    	         sprintf(t,"Bytes: %d\nRead: %s\n", dwRead, wpString);
              	MessageBox(NULL,t,"Read",0);
    

    Bin gestern 3 Stunden gesessen-> Kein Ergebnis. 😞

    Wie kann ich einen Platzhalter setzten (und für welches Zeichen (\0)oder HEX 0x00????)
    bzw Kann ich dann die Zeichen wieder in einen String zusammensetzten.

    Habe es mit strstr und strncpy versucht->Erfolglos


  • Mod

    Ich verstehe immer noch nicht was Du mit den gelesenen Daten willst.
    Wenn Du Daten, die ein 0x0 Zeichen enthalten an eine Routine weitergibt, die annimmt, dass ein String bei 0x0 endet, wir z.B. sprintf, dan wirst Du nie die Daten damit irgend wo hin bekommen.

    Auf MessageBox kann keine 0x0 ausgeben. Das ist kein darstellbares Zeichen! Was willst Du mit den Daten wirlich machen? Gelesen werden sie, nur werden Sie auf durch die Methoden, die Du verwendest nicht transportiert.

    Was möchtest Du?



  • Ich bekomme diese Antwort:
    02 FD E0 D0 00 00 06 7E 4F 4B 3B 0D 0A 91
    Und in Diesem Fall benötige ich Byte 9+10
    also 4F und 4B

    mfg Maxx



  • Dann hol dir doch diese Bytes - über Indexzugriff solltest du problemlos drankommen (du mußt nur daran denken, daß der Index bei 0 beginnt, du deine Werte also als wpString[8] und wpString[9] erwischst).



  • Stehe jetzt total auf der Leitung
    Kannst du mir einen Tip geben wie ich das machen ?

    Danke im voraus



  • Das sollte aber eigentlich Grundlagenwissen sein:

    sprintf(t,"data bytes %x %x",wpString[8],wpString[9]);
    MessageBox(NULL,t,"Read",0);
    


  • Na klar !
    Danke



  • Hier schwirt auch irgendwo ein source zu bin2dez bzw. bin2hex etc. rum, ganz sinnvoll wenn man mit werten arbeitet die nicht mit ascii darstellbar sind,..
    gruß


Anmelden zum Antworten