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

Serielle Schnittstelle dauerhaft auslesen

 

Ceres
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 24.09.07
Wohnort: In der Nähe von Göttingen
Version: ---
     Beitrag Verfasst am: 25.09.2007, 17:04     Titel: Serielle Schnittstelle dauerhaft auslesen
  Antworten mit Zitat      
Hallo,
ich möchte mit Matlab ein Programm schreiben, mit dem ich meine Akkuladestation (später auch Wetterstation) auslesen kann. Das Gerät wird über die RS-232-Schnittstelle an den Rechner angeschlossen. Alle 2 Sekunden erhält man Informationen über einen Ladeschacht. Das Auslesen der Daten mittels fread klappt soweit auch ganz gut, aber ich möchte nicht nur einmal die Daten auslesen, sondern permanent. Am besten wäre es natürlich, wenn Matlab immer wenn Werte verfügbar sind, diese holt. Ist das irgendwie möglich? Ich habe auch schonmal eine Endlosschleife fabriziert, aber dann hat er immer ausgelesen, auch in der Zeit wo keine Werte verfügbar waren, aber das ist ja Ressourcenverschwendung.

Bin für jeden Tip dankbar.

MfG

Ceres
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 26.09.2007, 08:15     Titel:
  Antworten mit Zitat      
Da ich mich demnächst u.a. mit automatischer/zeitgesteuerter Bilderkennung beschäftigen werde, habe ich mich schon ein bisschen umgehört und habe erfahren, dass Matlab interne Timer hat. Diese könnten dir behilflich sein. Allerdings weiß ich (noch) nicht wie man diese anspricht bzw. implementiert.
Aber ich denke, dass die Hilfe in diesem Fall eine gute Anlaufstelle ist.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
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: 26.09.2007, 14:27     Titel:
  Antworten mit Zitat      
Hände weg von WHILE-Schleifen und von Timern... Wink

mit der WHILE-Schleife blockierst Du MATLAB! Und ein extra Timer ist überflüssig, weil die Serieller Objekt unter MATLAB einen Timer schon mit sich bringt, allerding wäre das nicht empfehlenswert zu benutzen.

Wie Du schon selbst vorgeschlagen hast - sollte MATLAB selbst einen Callback feuern, sobald Daten empfangen wurden - und das geht mit MATLAB. Zauberstichwörter sind:

BytesAvailableFcn
BytesAvailableFcnCount
BytesAvailableFcnMode
Terminator

"BytesAvailableFcn" feuert einen Callback wenn eine bestimmte Anzahl an Bytes vorliegt (im Falle, wenn Du weisse, dass alle 2 sekunden zB genau 40Bytes gesendet werden, muss also "BytesAvailableFcnCount" auf 40 stehen). Oder Du definierst einen Terminator (LF, CR, oder auch Bytes Folge). Solange diese Bytes oder die Steuerzeichen empfangen werden, feuert Dein Callback von "BytesAvailableFcn".
Je nach dem wie Du vorgehst sollte der "BytesAvailableFcnMode" auf "Byte" oder "Terminator" entsprechend gesetzt werden.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Ceres
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 24.09.07
Wohnort: In der Nähe von Göttingen
Version: ---
     Beitrag Verfasst am: 27.09.2007, 11:21     Titel:
  Antworten mit Zitat      
Danke für die Antworten. Und wie gehe ich vor wenn die Anzahl der Bytes immer unterschiedlich ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 01.10.2007, 17:42     Titel:
  Antworten mit Zitat      
Hallo Ceres,
wie outsider schon schrieb, musst Du dann einen Terminator definieren (also eine Zeichenfolge, oder CR für "Enter") der den Datenstrom immer abschließt. Sobald dieser im input buffer vorliegt, wird die angegebene Callback-Funktion ausgeführt. Mit der Instrument Control Toolbox kann man je nach Inputformat auch eosCharCode ("end of string") als BytesAvailableFcnMode wählen.

Ich kann es hier nicht testen, aber nach der Hilfe müsste es mit Terminator so gehen:
Code:
s = serial('COM1');    % oder was du eben hast
s.Terminator = 'CR';           % zum Beispiel
s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = @yourcallback;

fopen(s)
...
fclose(s)


Das ist nicht gerade mein Spezialgebiet, aber vielleicht hilft es ja immerhin, das Problem einzugrenzen. Wink Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
entchen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2014, 22:30     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich grabe mal den alten Thread aus, da ich mich im Rahmen meiner Masterarbeit mit dem Einlesen der RS232 Schnittstelle befasse.

Dazu habe ich ein paar Verständnisfragen:
Zitat:
Hallo Ceres,
wie outsider schon schrieb, musst Du dann einen Terminator definieren (also eine Zeichenfolge, oder CR für "Enter") der den Datenstrom immer abschließt. Sobald dieser im input buffer vorliegt, wird die angegebene Callback-Funktion ausgeführt. Mit der Instrument Control Toolbox kann man je nach Inputformat auch eosCharCode ("end of string") als BytesAvailableFcnMode wählen.


Code:
s = serial('COM1');    % oder was du eben hast
s.Terminator = 'CR';           % zum Beispiel
s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = @yourcallback;

fopen(s)
...
fclose(s)



Die Funktion fread() liest doch nur Daten aus dem Buffer ein; der Datenempfang über RS232 (und somit Speicherung im Buffer) läuft doch im Hintergrund permanent, sobald fopen() aufgerufen wird?
Falls dem so ist, dann müsste ja für ein kontinuierliches Auslesen der seriellen Schnittstelle nur ein fread() in der callbackfunktion stehen...

Damit der buffer immer wieder resettet wird, müsste ich doch den Port nach jedem fread() wieder schließen und danach wieder öffnen, oder wird der Buffer automatisch nach jedem Aufruf nach fread () gelöscht?


Sorry für die vielen Fragen, aber so ganz hab ich das Konzept mit dem seriellen Port noch nicht verstanden.
Gruß
 
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 - 2025 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.