Problem beim Abarbeiten einer Schleifenfunktion

  • VB6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonzo.

    Problem beim Abarbeiten einer Schleifenfunktion

    Hallo,

    habe folgendes Problem. Ich möchte mit einem externem Gerät über die serielle Schnittstelle
    kommunizieren. Dies funktioniert bis zu einem bestimmten Punkt ganz gut. Die Kommunikation
    läuft wie folgt ab.
    Nach einer Initialisationssequenz sendet das Gerät das Startwort "138". Um eine sicher
    Übertragung zu gewährleisten muß der PC mit dem umgekehrten Wort antworten.
    Also mit 255 - 138 = 117 antworten. Nachfolgend sendet das Gerät weiter Zeichen, die
    nach dem selben Verfahren beantwortet werden müssen.
    Hier liegt nun mein Problem. Im Beispiel wartet der PC zwar auf das Wort "138" und antwortet
    wie beschrieben, leider habe ich keine Idee wie er alle nachfolgenden Zeichen ebenfalls wandeln
    soll.

    <font face="courier new" size="2pt">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Timer1_timer()</font>

    <font color="#000000"> </font><font color="#0000AA">Do</font><font color="#000000"></font>

    <font color="#000000"> dat = READBYTE</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> dat > - 1 Then </font><font color="#00AA00">'Dateneingang prüfen</font>

    <font color="#000000"></font>

    <font color="#000000"> antwort = 255 - dat </font><font color="#00AA00">'Wert umkehren</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> dat = 138 </font><font color="#0000AA">Then</font><font color="#000000"> SENDBYTE antwort </font><font color="#00AA00">'Prüft Eingang von 138 und antwortet mit umgekehrtem Wert</font>

    <font color="#000000"></font>

    <font color="#000000"> wert = Hex(Str$(dat)) + " " </font><font color="#00AA00">'Formatiert Ausgabefenster</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> Len(wert) = 2 </font><font color="#0000AA">Then</font><font color="#000000"> wert = "0" & wert</font>

    <font color="#000000"> Text1.Text = Text1.Text + wert</font>

    <font color="#000000"></font>

    <font color="#000000"> </font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"></font>

    <font color="#000000"> </font><font color="#0000AA">Loop</font><font color="#000000"> </font><font color="#0000AA">Until</font><font color="#000000"> dat = - 1</font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    </font>




    Ich verwende eine DLL um leichter mit der Schnittstelle kommunizieren zu können, deshalb die
    Befehle "READ -und SENDBYTE".

    Für einen Tipp wäre ich sehr dankbar.

    Gruß
    GONZO

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonzo“ ()

    Ich weiß nicht, ob ich dich so richtig verstanden habe.
    If dat = 138 Then SENDBYTE antwort

    Hier sendest du nur, wenn das Eingangssignal 138 ist. Hat dieses IF einen bestimmten Zweck? Sonst lass es einfach weg und er sendet auch alle weiteren Signale in umgekehrter Form (255-dat) und nicht nur 138
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Dann manch dir eine boolsche Variable, die false ist. Sobald die 138 kommt, machst du sie true und ließt alle eingehenden SIgnale ein!?
    <pre>Private Sub Timer1_timer()
    Dim bRead As Boolean
    Do
    dat = READBYTE
    If dat > - 1 Then 'Dateneingang prüfen

    antwort = 255 - dat 'Wert umkehren
    If dat = 138 Then bRead=true
    if bRead then SENDBYTE antwort

    wert = Hex(Str$(dat)) + " " 'Formatiert Ausgabefenster
    If Len(wert) = 2 Then wert = "0" & wert
    Text1.Text = Text1.Text + wert

    End If
    Loop Until dat = - 1
    End Sub
    </pre>
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Danke für den Tipp, kann auch die Funktion nachvollziehen, doch leider funzt es nicht. Es werden immer wieder zwei und die selben Zeichen abwechselnd dargestellt, vielleicht ist es auch ein timing-Problem.
    Wenn ich wie im ersten Fall die Prüfung über mehere If..then Abfragen mache..

    z.B.
    If dat = 138 then...
    If Dat = 15 then..
    If Dat = 1 Then.. usw.

    klappts einwandfrei.
    Gibt es evtl. nicht eine Möglichkeit über eine verschachtelte Schleife ???

    Gruß
    GONZO
    Ich würde gerne helfen, ehrlich gesagt versteh ich dein
    Problem aber nicht. Du empfängst Daten. Diese Daten
    muss der PC mit dem umgekehrten Wert bestätigen.
    Im 1. Posting schreibst du, dass alle danachfolgenden
    Daten ebenfalls nach diesem Schema behandelt werden
    müssen, also immer den umgekehrten Wert zur Bestätigung
    senden. Agent hat ja schon richtig angemerkt, dass
    du dann einfach die If-Abfrage weglassen müsstest,
    dann würde immer auf die Anweisung der Schnittstelle
    mit dem umgekehrten Wert geantwortet.
    Dann sagst du aber:


    Hi,
    Es ist schon so gemeint, das er erst die 138 abwarten
    soll, diese dannwandelt und alle darauf folgende
    Zeichen, abwechselnd umwandelt.


    Besonders dieses abwechselnd macht mir Probleme,
    soll nur jede 2. Wert umgewandelt werden ?
    Das müsstest du mir nochmal erklären ...
    Es werden immer wieder zwei und die selben Zeichen abwechselnd dargestellt

    Könntest du vielleicht mal die Werte aus deiner Textbox posten? Heißt das, dass die Werte manchmal doppelt angezeigt werden? Wenn ja, kannst du das folgendermaßen abfangen:
    <p><font face="courier new" size="2pt">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Timer1_timer()</font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> lastSignal </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Byte</font><font color="#000000">, bRead </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Boolean</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Do</font><font color="#000000"></font>

    <font color="#000000">dat = READBYTE</font>

    <font color="#000000"></font><font color="#0000AA">If</font><font color="#000000"> dat > - 1 </font><font color="#0000AA">Then</font><font color="#000000"> </font><font color="#00AA00">'Dateneingang prüfen</font>

    <font color="#000000"></font>

    <font color="#000000">antwort = 255 - dat </font><font color="#00AA00">'Wert umkehren</font>

    <font color="#000000"></font><font color="#0000AA">If</font><font color="#000000"> dat = 138 </font><font color="#0000AA">Then</font><font color="#000000"> bRead = true</font>

    <font color="#000000"></font><font color="#0000AA">If</font><font color="#000000"> bRead </font><font color="#0000AA">And</font><font color="#000000"> </font><font color="#0000AA">Not</font><font color="#000000"> dat = lastSignal </font><font color="#0000AA">Then</font><font color="#000000"> SENDBYTE antwort: lastSignal = dat</font>

    <font color="#000000"></font>

    <font color="#000000">wert = Hex(Str$(dat)) + " " </font><font color="#00AA00">'Formatiert Ausgabefenster</font>

    <font color="#000000"></font><font color="#0000AA">If</font><font color="#000000"> Len(wert) = 2 </font><font color="#0000AA">Then</font><font color="#000000"> wert = "0" & wert</font>

    <font color="#000000">Text1.Text = Text1.Text + wert</font>

    <font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Loop</font><font color="#000000"> </font><font color="#0000AA">Until</font><font color="#000000"> dat = - 1</font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <font color="#000000"></font>

    </font>
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hi, erstmal Danke für die Hilfe..... :))
    leider bleibt alles ohne Erfolg ;(

    Ich versuch nochmal den Ablauf zu erklären:
    Als erstes sende ich eine Startsequenz zum Endgerät. Dieses Antwortet mit 3 Zeichen hex 55, 01, 8A
    Der PC erkennt das letzte Zeichen hex 8A (oder dez 138) und muß zur Datenaufrechterhaltung mit dem umgekehrten Zeichen 138(h8A) -> 117(h75) antworten. Das Entgerät startet nun mit der Datenübertragung und sendet 15(h0F), der PC kehrt dieses Zeichen erneut um und antwortet mit 240(hF0), Endgerät sendet 01(h01) - PC antwortet 254(hFE) usw. usw. bis das letzte Zeichen übertragen wurde. Zur besseren Übersicht wandel ich die dezimale in eine hexadezimale Anzeige um. Wenn die Datenübertragung richtig abläuft, sollte ich folgendes in meiner Textbox haben:

    55 01 8A 75 0F F0 01 FE F6 09 38 C7 44 BB 30 CF
    39 C6 31 CE 39 C6 30 CF 33 CC 34 CB 42 BD 20 DF
    20 DF 03 .........

    stattdessen erhalte ich:

    55 01 8A 75 8A 75 8A 75 8A 75 8A 75 8A 75 55 8A
    01 AA 8A 75 FE 55 0F 75 8A 01 AA F0 8A 75 FE 55
    0F 75 8A ..........

    Ich vermute schon das der Fehler evtl. woander liegt.

    Danke nocheinmal für die Hilfe :))

    Gruß
    GONZO
    Ich schätze mal, der Fehler liegt bei deiner READBYTE-Funktion. Entweder ist das timing zu langsam/schnell oder du musst nochmal etwas Quelltext davon posten.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    So, hier der Code. Sicher verbesserungsbedürftig... :rolleyes:

    <font face="courier new" size="2pt">
    <font color="#000000"></font><font color="#0000AA">Option</font><font color="#000000"> </font><font color="#0000AA">Explicit</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> x </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Integer</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> dat </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Integer</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> wert </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">String</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> antwort </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Integer</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">Dim</font><font color="#000000"> n</font>

    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Command1_Click()</font>

    <font color="#000000"> CLOSECOM</font>

    <font color="#000000"> OPENCOM Text1.Text </font><font color="#00AA00">'Port mit Parametern von Text1 öffnen</font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <hr width="100%">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Command2_Click()</font>

    <font color="#000000"> Text3.Text = "" </font><font color="#00AA00">'Textfeld löschen</font>

    <font color="#000000"> Label2.Caption = ""</font>

    <font color="#000000"> Label3.Caption = ""</font>

    <font color="#000000"> x = 0</font>

    <font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <hr width="100%">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Command3_Click()</font>

    <font color="#000000"> OPENCOM "COM1:1200,N,8,1"</font>

    <font color="#000000"> REALTIME </font><font color="#0000AA">True</font><font color="#000000"> </font><font color="#00AA00">'Initialisierung 5 Baud Adresse 17</font>

    <font color="#000000"> TXD 1</font>

    <font color="#000000"> DELAYUS 200000</font>

    <font color="#000000"> TXD 0</font>

    <font color="#000000"> DELAYUS 600000</font>

    <font color="#000000"> TXD 1</font>

    <font color="#000000"> DELAYUS 200000</font>

    <font color="#000000"> TXD 0</font>

    <font color="#000000"> DELAYUS 200000</font>

    <font color="#000000"> TXD 1</font>

    <font color="#000000"> DELAYUS 400000</font>

    <font color="#000000"> TXD 0</font>

    <font color="#000000"> REALTIME </font><font color="#0000AA">False</font><font color="#000000"></font>

    <font color="#000000"> CLOSECOM</font>

    <font color="#000000"> OPENCOM Text1.Text</font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <hr width="100%">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Command4_Click()</font>

    <font color="#000000"> </font><font color="#0000AA">End</font><font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <hr width="100%">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Form_Unload(Cancel </font><font color="#0000AA">As</font><font color="#000000"> </font><font color="#0000AA">Integer</font><font color="#000000">)</font>

    <font color="#000000"> CLOSECOM </font><font color="#00AA00">'Port nach Verlassen schließen</font>

    <font color="#000000"></font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    <hr width="100%">
    <font color="#000000"></font><font color="#0000AA">Private</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"> Timer1_timer() </font><font color="#00AA00">'Daten empfangen</font>

    <font color="#000000"> </font><font color="#0000AA">Do</font><font color="#000000"></font>

    <font color="#000000"> dat = READBYTE</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> dat > - 1 </font><font color="#0000AA">Then</font><font color="#000000"></font>

    <font color="#000000"> x = x + 1 </font><font color="#00AA00">'Anzahl Zeichen</font>

    <font color="#000000"> antwort = 255 - dat</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> dat = 138 </font><font color="#0000AA">Then</font><font color="#000000"> SENDBYTE antwort</font>

    <font color="#000000"> Label3.Caption = x</font>

    <font color="#000000"> Label2.Caption = dat</font>

    <font color="#000000"> wert = Hex(Str$(dat)) + " "</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> Len(wert) = 2 </font><font color="#0000AA">Then</font><font color="#000000"> wert = "0" & wert</font>

    <font color="#000000"> Text3.Text = Text3.Text + wert</font>

    <font color="#000000"> n = n + 1 </font><font color="#00AA00">'Zeilensprung nach 16 Zeichen</font>

    <font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"> n = 16 </font><font color="#0000AA">Then</font><font color="#000000"> n = 0: Text3.Text = Text3.Text + Chr(13) + Chr(10)</font>

    <font color="#000000"> Text3.Refresh</font>

    <font color="#000000"> </font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">If</font><font color="#000000"></font>

    <font color="#000000"> </font><font color="#0000AA">Loop</font><font color="#000000"> </font><font color="#0000AA">Until</font><font color="#000000"> dat = - 1</font>

    <font color="#000000"></font><font color="#0000AA">End</font><font color="#000000"> </font><font color="#0000AA">Sub</font><font color="#000000"></font>

    </font>


    Gruß
    GONZO