Serielle Schnittstelle liefert Piek



  • Hallo,

    ich versuche eine serielle Schnittstelle zu steuern. Das Senden der Befehle funktioniert, nur das Auslesen nicht. Ich bekomme immer ein Piek(Spielkartenzeichen) in der Ausgabe meines Dosfensters.
    Ich arbeite mit WinXP 32 und dem DEVC++-Compiler.
    Mein Gerät ist ein Counter (ND280 von Heidenhain).
    Wie lese ich die Daten (den auf dem Gerät angezeigtem Winkel) aus?

    Hier ist der Teil meines Quellcodes:
    ...
    void write(){

    char test[256]; //Zeichenkette: 256 Zeichen

    DWORD nWritten = 0; //Zahlvariable für Zeichen zum Schreiben
    DWORD nRead = 0;

    //WriteFile( SerielleSchnittstelle, KeyEnter, 7, &nWritten, NULL);
    //soll nur 7 Zeichen ohne die 0 senden

    WriteFile( SerielleSchnittstelle, KeyC, 7, &nWritten, NULL);

    if( nWritten!= 7 ) //wenn ungleich 7 Zeichen geschrieben

    {

    cout << "hat nicht geklappt\n";

    }
    else
    cout << "hat geklappt\n";

    ReadFile(SerielleSchnittstelle, test, 256, &nRead, NULL);
    cout << "es wurden " << nRead << " Bytes gelesen\n";

    }

    void nullen() {
    WriteFile( SerielleSchnittstelle, SetPositionTo0, 7, &nWritten, NULL);
    }

    void winkel(){

    int s = 0;
    DWORD nRead = 0;
    char RxBuffer[256] = {0};

    WriteFile( SerielleSchnittstelle, ShowActualPosition, 7, &nWritten, NULL);
    ReadFile(SerielleSchnittstelle, RxBuffer, 256, &nRead, NULL);
    //sizeof(RxBuffer) = s

    cout << "Der Inhalt ist " << RxBuffer << " .\n";

    }
    ...

    Liebe Grüße,
    ACDC



  • hallo und willkommen.

    bitte codetags verwenden:
    [code="cpp"][/code]

    ➡

    int syntaxhighlighting;
    void f()
    {
        // einrückungen
    }
    


  • ACDC schrieb:

    ReadFile(SerielleSchnittstelle, test, 256, &nRead, NULL);
    cout << "es wurden " << nRead << " Bytes gelesen\n";
    

    Und wieviele Bytes werden gelesen?
    Das Pik ist m.E. ein ACK (ASCII: 6) - sieht nicht unbedingt falsch aus. Was steht denn in der Doku zum Protokoll?

    Edit:

    Handbuch schrieb:

    Der ND quittiert jeden richtig erkannten Tastenbefehl durch das
    Senden des Steuerzeichens ACK [..]

    => Doku lesen!



  • Danke nochmal für die Antwort.
    Das Problem lag an der Warteschleife, die nicht ausgeführt wurde.
    Als Lösung ist die Funktion sleep(ms) hier verwendet worden. Eine Wartefunktion zwischen dem Auslesen der Werte ist von Nöten. Leider ist das Programm nun plattformabhängig.



  • ACDC schrieb:

    Als Lösung ist die Funktion sleep(ms) hier verwendet worden. Eine Wartefunktion zwischen dem Auslesen der Werte ist von Nöten. Leider ist das Programm nun plattformabhängig.

    Ab C++11 gibt es ein sleep im Standard falls dir das weiterhilft.



  • ACDC schrieb:

    Leider ist das Programm nun plattformabhängig.

    Wie, "nun"?
    Meinst du etwa ReadFile und WriteFile wären nicht plattformabhängig?
    Eieiei...

    BTW: du kannst über SetCommTimeouts timeouts einstellen.
    Dann kannst du, wenn du weisst dass 1 Byte als Antwort erwartet wird, dieses einfach mal lesen. Ohne Pause vorher.
    ReadFile wartet dann maximal so lange wie über SetCommTimeouts eingestellt wurde.

    Hat den grossen Vorteil dass man sehr grosszügige Timeouts verwenden kann, ohne das Programm unnötig zu bremsen.


Anmelden zum Antworten