CREAD-Fehlermeldung: Keine Daten / Variablen mehr vorhanden

  • Hallo zusammen,
    nach meinen ersten erfolgreichen Gehversuchen in der seriellen Kommunikation mit CREAD / CWRITE bin ich nun auf ein Problem gestoßen, bei dem ich mal euren Ratschlag bräuchte:


    Ich kommunizere mit einem PC und benutzt dort Hyperterminal. Ich kann mit CWRITE erfolgreich Daten an den PC schicken und auch mit CREAD einen EINZELNEN Wert einlesen und den Roboter damit verfahren. Nun möchte ich die Werte so lange einlesen, bis eine 0 vom PC gesendet wird.
    Also habe ich das CREAD in eine Schleife gepackt. Beim ersten Durchlauf klappt auch alles wunderbar, beim zweiten Durchlauf wartet der Zeiger am WAIT FOR $DATA_SER3>0. Nach dem Senden der Daten vom PC geht er auf CREAD, bleibt aber dann mit der Fehlermeldung: Keine Daten / Variablen mehr vorhanden stehen.
    Sowohl in der Telnet-Ausgabe als auch im Logfile sind (für mich) keine Fehler erkennbar.


    Wo kann der Fehler liegen? :huh:


    Vielen Dank schon mal für eure Hilfe!
    Gruß,
    Stephan


    Hier der verwendete Code:


    MW_T = #SYNC
    MR_T = #COND
    TIMEOUT = 10.0
    OFFSET = 0
    REPEAT
    COPEN(:SER_3, HANDLE)
    WAIT FOR $DATA_SER3>0
    CREAD(HANDLE, SR_T, MR_T, TIMEOUT, OFFSET, "%d", LOOPCNT)
    ZWPOS = $POS_ACT
    ZWPOS.X = ZWPOS.X + LOOPCNT*10
    PTP ZWPOS
    CCLOSE(HANDLE, SC_T)
    UNTIL LOOPCNT == 0


    Der Auszug aus der Logdatei (enthält auch die Positionsdaten, die ich an den PC sende):


    ==== Logging serial communication V1.0 ====
    Log Date 28.7.8 : 12:48
    ==== receive > send < ====



    COM 1: no action



    COM 2: no action



    COM 3: Protocol# 4


    COPEN
    < <11> +445.0000 +0.0000 +615.0000 +0.0000 +90.0000 +0.0000
    CCLOSE
    < <13>
    COPEN
    < <11>
    > 9
    CCLOSE
    < <13>
    COPEN
    < <11>
    > 9
    CCLOSE
    < <13>
    COPEN
    < <11>
    > 9


    COM 4: no action

    Einmal editiert, zuletzt von Irgi ()

  • Schritt für Schritt zum Roboterprofi!
  • Nachdem ich ein funktionierendes Programm im Netz gefunden habe und mal verglichen habe, wurde mir das Problem klar und hab die Erklärung auch in der Doku gefunden:


    Der Offset wird beim Lesen hochgezählt. Wenn also bei einem weiteren
    CREAD-Befehl wieder an der 1. Stelle mit dem Lesen begonnen werden soll,
    muss der Offset vor diesem Befehl auf 0 gesetzt werden. Anderenfalls wird der
    hochgezählte Offset des vorigen Befehls übernommen.


    In der Schleife immer schön den Offest zurück auf 0 und schon klappts! :genau:


    MW_T = #SYNC
    MR_T = #COND
    TIMEOUT = 10.0


    REPEAT
    COPEN(:SER_3, HANDLE)
    WAIT FOR $DATA_SER3>0
    OFFSET = 0
    CREAD(HANDLE, SR_T, MR_T, TIMEOUT, OFFSET, "%d", LOOPCNT)
    ZWPOS = $POS_ACT
    ZWPOS.X = ZWPOS.X + LOOPCNT*10
    PTP ZWPOS
    CCLOSE(HANDLE, SC_T)
    UNTIL LOOPCNT == 0

    Einmal editiert, zuletzt von Irgi ()

  • freut mich das Du selbst draufgekommen bist :supi:


    noch ein Vorschlag bitte:
    - nimm das COPEN aus der Schleife vor das REPEAT
    - lösche CCLOSE (Aufruf nicht notwendig hier)


    Dein Grundproblem ist aber das XONXOFF-Protokoll das nach einer Zeit
    CHAR_TIMEOUT=50 ; msec Timeout after last received character
    ; to recognize the end of telegram
    das Ende des Telegramms erkennt. Nicht gut bei einer händischen Eingabe am Hyperterminal

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden