Daten über RS232 empfangen

isom
2011-05-04
2011-05-09
  • isom - 2011-05-04

    Hallo zusammen,

    ich möchte über die RS 232 Schnittstelle versch. Strings an einen Thermostaten senden bzw. die entsprechenden Antworten empfangen. Zusätzlich muss ich die empfangenen Strings in Real-Variablen konvertieren um diese in bspw. IF-Funktionen einzubinden.
    Da ich weiss, was ich senden muss damit es der Thermostat auch versteht und was er mir genau zurückschickt, habe ich versch. Tests mit dem HyperTerminal durchgeführt.

    Ich habe nun das Problem, dass wenn ich den Thermostaten mit Hilfe des HyperTerminals über die Tastatur simuliere, mir das Programm nach der ersten eingegebenen Ziffer schon komplett durchlaufen wird. Dies Obwohl ich bei Schritt 8 eine Bedingung programmiert habe, bei der der Wert 'rAntwortReal' grösser als 030.00 sein muss (Die Antwort erfolgt immer im Format XXX.XX).
    Die empfangenen Zahlen können in den globalen Variablen unter ReceiveBuffer.Data angeschaut werden.

    Hat jemand eine Idee wo mein Fehler liegen könnte?
    Ich hab den betreffenden Ausschnitt aus dem Programm beigelegt.

    Vielen Dank!
    isom

    IMG: Programmausschnitt.JPG

     
  • Oberchefe - 2011-05-04

    ich glaube, Du hast das REAL Format nicht verstanden, zumindest sieht das bei der Abfrage unter Case 8 so aus.

     
  • Uwe - 2011-05-05

    Der Fehler liegt im CASE 6.
    ReceiveBuffer2.Index beinhaltet die Anzahl der empfangenen Zeichen.

    Bei einer seriellen Übertragung trudeln die Zeichen nacheinander ein.
    Der Empfangsbaustein schaut zwischendurch bei der Schnittstelle vorbei,
    holt die inzwischen eingtrudelten Zeichen ab, trägt sie im ReceiveBuffer ein und
    erhöht entsprechend den Index.

    Wenn du also z.B. 'Hallo Welt' schickst,
    dann steht im ReceiveBuffer nach dem ersten Aufruf z.B.
    'Ha' und der Index steht auf 2
    nach dem 2. Aufruf z.B.
    'Hallo' und der Index steht auf 5 u.s.w.

    Der Empfangsbaustein weiss ja nicht was und wieviel du ihm schickst,
    es ist ja keine Schleife um dein Paket.

    Du musst also in deiner Applikation nachschauen ob du hinreichend
    Zeichen erhalten hast und ob diese deiner geforderten Syntax entsprechen.

    Zurück zum CASE 6
    Wenn du in der FOR-Schleife 10 Zeichen erwartest (0..9) dann
    musst du in der Abfrage davor erst gucken ob du überhaupt
    schon mindestens 10 Zeichen empfangen hast.
    Also IF ReceiveBuffer2.Index >= 10 THEN

    Weiterhin würde ich zumindest einen Timeout darüber legen ...
    damit neu synchronisiert wird falls die Übertragung mal schief läuft
    und ein Zeichen verloren geht.

     
  • Erik Böhm - 2011-05-05

    Moin

    Und wo wir grade dabei sind, woztu eigentlich REAL ???
    Vergleiche doch: IF sAntwort = '030.00$R$L' then
    ....

    Gruß Erik

     
  • isom - 2011-05-09

    Hallo miteinander

    Danke für eure Antworten!

    Werde die erwähnten Sachen versuchen und mich hier im Forum melden, sobald das Problem gelöst wurde.

    Grüsse
    isom

     

Log in to post a comment.