WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Intrument Control Toolbox - TCP/IP - Callbacks

 

zyzyx
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 05.11.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2007, 19:08     Titel: Intrument Control Toolbox - TCP/IP - Callbacks
  Antworten mit Zitat      
Hallo,

Ich nutze die Instrument Control Toolkox für meine TCP/IP Kommunikation.
Ich nutze die von der Toolbox bereitgestellten Callbacks, die ich folgendermaßen definiert habe :

Code:

TCPIPobject = tcpip(ip,port);

%Number of Bytes needed to start the Callback
TCPIPobject.BytesAvailableFcnCount = 13;
TCPIPobject.BytesAvailableFcnMode = 'byte';
TCPIPobject.BytesAvailableFcn = {@Callback_BytesAvailableFcn};
 


Ich erhalte über die Schnittstelle einen Datenstring der seine eigene Länge mitsendet. Dies tut er bis zur 13. Stelle.

Datenstring = {Länge(13 Bytes), Daten}

Aus diesem Grund löse ich die Callback Funktion nach 13 Bytes aus, lese die Länge aus diesen 13 Bytes und entnehme die Daten mit einer For-Schleife, die über eben dieser Länge läuft aus dem Puffer.

Ich möchte die, mit der Callback-Funktion erhaltenen Daten in meiner Main Routine nachdem ich sie erhalten habe verarbeiten.

Mein Problem besteht darin, dass ich bei Datenstring die grösser gleich 26 Bytes sind nicht in die Main Routine komme, denn der Callback wird mehrmals hintereinander ausgelösst!

Gibt es eine Möglichkeit einen Callback nach einem Aufruf zu deaktivieren oder zu stoppen?
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 06.11.2007, 11:48     Titel:
  Antworten mit Zitat      
ich hatte das Problem ebenfalls und zwar recht einfach mit einer Flag-Variable gelöst.

Diese ist bei der Initialisierung gleich 0. Wenn die ersten 13 Bytes eingelesen - ist alles ok. Dein Callback berechnet die länge für den nachvolgenden Packet (was programmierst du eigentlich - die Arbeitsschritte sind in meinem Fall genau so - habe einen ICQ-Client mit remote Steuerung für MATLAB programmiert) setzt die Flag-Variable global auf 1 und liest anschliessend die restlichen Daten aus.

Aufgrund der Datenmenge werden jedoch weitere Callbacks gefeuert, während der erste Callback noch fleissig die Daten ausliest und verarbeitet. Wird nun so ein "dummy"-Callback "parallel" aufgerufen, so checkt dein Callback ob die Flag-Variable 0 oder 1 ist... Der Rest dürfte nun nachvollziehbar sein. Wurden die Daten von dem ersten Callback ausgelsen und verarbeitet, so wird der Falg wieder auf 0 gesetzt.

Nebenbei sollte aber auch geprüft werden ob "BytesAvailable" größer 0 ist oder nicht, denn die dummy Callbacks in einer queue landen und werden aufgerufen, nach dem der erster Callback die Daten erfolgreich ausgelesen und die Flag-Variable zurückgesetzt hat... In diesem Falle kann man abfragen ob irgendwas im Puffer vorliegt oder nicht...

Eine stabiliere Lösung (auf die bin ich dann später auch gewechselt) ist jedoch den Callback nicht bei einer bestimmten Datenmenge abzufeuern, sondern bei einer bestimmten Bytesfolge (also mit TERMINATOR abreiten, statt mit BYTE)






MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
zyzyx
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 05.11.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2007, 20:52     Titel:
  Antworten mit Zitat      
Das mit dem Flag ahbe ich ausprobiert und es funktioniert bei mir nicht!

Einen Terminator kann ich ebenfalls nicht verwenden, weil wich nicht weiss wie der String aussieht den ich bekomme.

Es wäre schon wenn es noch andere Ideen gibt.
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 07.11.2007, 21:12     Titel:
  Antworten mit Zitat      
Zitat:
Das mit dem Flag ahbe ich ausprobiert und es funktioniert bei mir nicht!

Tja... offensichtlich hast Du es nicht richtig umgesetzt... Rolling Eyes

Zitat:
...weil wich nicht weiss wie der String aussieht den ich bekomme.

Wieso sagst nicht gleich, dass Du weisst, dass auf String wartest?!
Mit FGETL kann man einen empfangen String auslesen.



MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.