![]() |
Re: async Fragen
Ich ´bins mal wieder, steh schon wieder vor einem problem:
ist es irgendwie möglich anstatt 1 ner antwort drei zu bekommen? aber jede dieser antworten muss abgearbeitet werden. z.b antwort a:8 byte antwort b:8 byte antwort c:8 byte antwort a wird das 2. byte in die var x hinterlegt antwort b wird das 8. byte in die var y hinterlegt antwort c wird das 2,3. byte in die var w,z hinterlegt ist so was möglich??? gruß xeus |
Re: async Fragen
Hi,
seltsame Frage... Nach meinem Verständnis solltest du mehrere Befehle für das Messgerät zur Verfügung haben, deren Sendeformat immer eine feste Anzahl Bytes umfassen. Jeder Befehl erhält Antwort innerhalb einer bestimmten Zeitspanne (time-out). Auch eine Antwort vom Messgerät hat ein festes Format (8 Byte, Struktur kennst du). Eventuell gibt es Befehle, die keine Antwort erhalten oder auch solche, auf die mehrere Antworten eingehen. Auf den letzten Fall scheinst du anzuspielen. Habe ich bis hierher alles richtig verstanden? Deine drei Antworten kommen hintereinander weg ohne hand shaking? Weisst du vorher wieviele Antwort-Pakete eingehen werden oder ist die Anzahl eine Überraschung? marabu |
Re: async Fragen
Also, ich sende eine anfrage:
z.b gib mir die spannung adr. 2 commando. 50 par.32 par.32 par.32 par.32 par.32 par.32 clcl.3 clch.177 daraufhin bekomme ich z.b transstat. 0 stat. 6 e3. 0 e2.12 e1. 5 e0. 1 clcl.4 clc.98 aus den bytes e3-e0 berechne ich dan den integer z.b spannung 200 diese 200 lass ich mir z.b im label1 anzeigen. nun will ich z.b die alle werte zyklisch nacheinander abfragen, aber sie müssen wegen der weiterverarbeitung natürlich seperat hinterlegt werden, damit ich sie z.b jeden wert in einem anderen label ausgeben kann ich stell mir das so vor frage1 frage2 frage3 usw antwort1 => in x1 hinterlegt antwort2 => in x2 hinterlegt antwort3 usw kannst du mir helfen???? |
Re: async Fragen
Sieht doch so aus, als ob du für jede Antwort zuerst eine Frage schicken musst. Was meinst du mit zyklisch? Willst du in festen Zeitabständen die Spannung abfragen? Oder willst du möglichst schnell hintereinander Spannung, Stromstärke und CosPhi (beipielsweise) abfragen?
marabu |
Re: async Fragen
sehr richtig, ich will mehrere fragen nacheinander stellen
die problematik, ich hoffe verständlich, gestellt es funktioniert schon, wenn ich auf button1click (frage U stell), dass er mir dann die passende antwort sendet und mir den wert in label1 (für U)ausgibt. doch wenn ich auf button2 click (Frage A stell), soll er mir doch den wert nicht im label1 für u ausgeben sondern z.b im label2 für A ich hoff du verstehst was ich mein |
Re: async Fragen
Wir dir denn in der Antwort vom Gerät gesagt was die Antwort beinhaltet? (Ich frage jetzt aber nicht noch einmal nach dem Befehlsprotokoll des Gerätes).
|
Re: async Fragen
Jetzt, ja.
Zu deinem ReceiveBuffer1 führe noch eine weitere Variable ein:
Delphi-Quellcode:
Wenn du dein Command mit PutString() sendest, dann speichere es auch gleich noch in CommandCode ab. So kannst du beim Eintreffen der Antwort erkennen, wo du die Werte sichtbar machen willst:
type
TDemoForm = class(TForm) ... private CommandCode: Char; ReceiveBuffer1: array of byte; end;
Delphi-Quellcode:
Die Funktion Messwert() habe ich mir eben ausgedacht - nur damit du die nicht irgendwo suchst...
begin
... case CommandCode of 'U': LabelU.Caption := IntToStr(Messwert(ReceiveBuffer1)); 'A': LabelA.Caption := ... end; end; marabu |
Re: async Fragen
das problem ist, in der antwort ist weder die adresse des geräts empfangenen geräts noch die info um welchen wert es sich handelt. kann mann es nicht so machen, dass mann sagt receivebuffer[0] ist begrenzt bis auf [7] alles was nun empfangen wird,wird im receivebuffer2 gespeichert usw.
|
Re: async Fragen
Aufgrund deiner Beispielwerte war schon klar, dass da kein overhead zurückgeschickt wird, aber im Gegenzug bedeutet das: Keine Antwort ohne Frage, rein sequentielles Protokoll. Du kannst natürlich für jedes Gerät einen eigenen ReceiveBuffer definieren, aber du kannst auch einfach zusätzlich zu CommandCode noch eine Variable DeviceNumber vom Typ Byte pflegen. Wenn du dann die Daten empfangen hast, dann kannst du CommandCode und DeviceNumber auswerten:
Delphi-Quellcode:
Wenn du jetzt beim senden noch zusätzlich die Variable RequestPending auf TRUE setzt und im TriggerAvail-Ereignis diese Variable wieder auf FALSE setzt, dann kannst du die Abfragen serialisieren und es gibt keine überschriebenen Daten im Empfangspuffer.
type
TDemoForm = class(TForm) ... private CommandCode: Char; DeviceNumber: Byte; RequestPending: boolean; ReceiveBuffer: array of byte; end; marabu |
Re: async Fragen
also wär es theoauch möglich, das ich für jeden wert eine eigene frage hät und für jeden wert einen entsprechenden buffer, so das ich nacheinander fragen stelle und pro frage einen eigenen antwortbuffer bekomme?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz