Jump to content

Rückgabe von Read/write Funktion (RS232 Bricklet)


Claymars

Recommended Posts

Hallo zusammen,

wir versuchen eine Datenübertragung zwischen einem Windows PC und einem Fluke Kalibrator herzustellen. Dafür haben wir den Tinkerforge Masterbrick (mit WIFI Extention 2.0) als Access Point verbunden. Den Kalibrator haben wir per RS232 V2 Bricklet mit dem Tinkerforge verbunden.

Die Verbindung können wir auch aufbauen, jedoch ist uns nicht klar, wie wir Rückmeldungen in Matlab erhalten. Mit dem Brick Viewer können wir Befehle an den Kalibrator senden (wie z.B. die Identität oder Sprache abfragen). Jedoch ist uns auch hier nicht klar, wie man Daten austauscht und speichert.

Vielleicht hat einer von euch eine Idee, wie wir Daten empfangen und speichern können. Vielen Dank schonmal!

Viele Grüße,

Claymars

 

connectTinkerforge_main.JPG

connectTinkerforge.m

Link zu diesem Kommentar
Share on other sites

Teste mal bitte das Loopback Beispiel, ignoriere dabei aber den Kommentar über RX1 und TX Pin, sondern lass den Jumper auf RX1 und RX2:

https://www.tinkerforge.com/de/doc/Software/Bricklets/RS232V2_Bricklet_MATLAB.html#loopback-matlab

Dort änderst du die UID von XYZ auf MbG und den Host von localhost auf 192.168.42.1. Ansonsten änderst du vielleicht noch die Konfiguration wenn der Fluke Kalibrator nicht mit 115200 Baud 8N1 kommuniziert.

Link zu diesem Kommentar
Share on other sites

  • 2 weeks later...

Hallo photron,

vielen Dank für deine Antwort. Wir haben nun versucht das Beispiel zu nehmen. Das einzige was wir angepasst haben, ist die Konfiguration der Schnittstelle (baudrate = 9600) und die UID.

Das Programm lässt sich zwar ausführen, allerdings gibt es nichts zurück. Wir haben dann mit rs232.read() versucht einen Rückgabewert zu erhalten, hatten jedoch keinen Erfolg.

Im Anhang sind entsprechende Bilder, vielleicht kannst du damit mehr anfangen als wir.

Wenn wir cb_read(e) ausführen wollen, bekommen wir einen Fehler. Wenn wir nur rs232.read(ans) einfügen, bekommen wir zwar keinen Fehler, jedoch ist die zurückgegebene Variable leer.

Wahrscheinlich verstehen wir nicht so genau, wie der Read Callback funktioniert. Könntest du uns diesen erläutern? Wir haben das so verstanden, dass wir dann wenn wir einen "write" Befehl geben, der Rückgabewert aufgefangen wird, jedoch wissen wir nicht wie wir diesen auffangen können.

Vielen Dank und viele Grüße,

Claymars

Tinkerforge_RS232_Example_mit_read.JPG

Tinkerforge_RS232_Example_mit_cb_read.JPG

Tinkerforge_RS232_Example.JPG

Link zu diesem Kommentar
Share on other sites

Du kannst die über RS232 empfangenen Daten auf 2 Weisen abfragen. Entweder durch Aufruf der read Funktion, oder durch Verwendung des Read Callbacks. Diese beiden Weisen schließen sich aber gegenseitig aus.

Beim Read Callback registrierst du eine Funktion (in diesem Fall cb_read) beim rs232 Objekt. Diese Funktion wird dann vom rs232 Objekt aufgerufen, wenn ein Read Callback empfangen wird. Du selbst rufst nicht die cb_read Funktion auf, auch nicht mit dem Rückgabewert der write Funktion.

Ein weiteres Problem ist, dass du nicht auf das Empfangen der Antwort vom Kalibrator wartest, sondern write, read und disconnect direkt hintereinander weg aufrufst. Zudem Zeitpunkt an dem read aufrufst ist das RS232 Bricklet möglicherweise noch nicht mal damit fertig die Daten an den Kalibrator zu senden. Im Loopback Beispiel wird über den Aufruf input('Press key to exit\n', 's'); das Beispiel laufen gehalten, so dass die Antwort ankommen kann.

Die write Funktion blockiert nicht, bis die Daten wirklich über RS232 gesendet wurden und die read Funktion wartet nicht auf den Empfang von Daten. Beide arbeiten auf Buffern im Bricklet. Die write Funktion schreibt Daten in den Ausgangs-Buffer und die read Funktion liest Daten aus dem Eingangs-Buffer. Das Bricklet sendet und empfängt dann dazu asynchron Daten über die RS232 Schnittstelle und liest diesen aus den Buffern oder schreibt sie hinein.

Wirf mal die cb_read Funktion raus und deren Registrierung (Zeile 17) und ersetzt die Aktivierung des Read Callback (Zeile 20) durch rs232.disableReadCallback(); um sicher zu sein das der Callback deaktiviert ist. Nach dem Aufruf der write Funktion baust du eine Pause von z.B. einer Sekunde ein, damit das Bricklet Zeit hat die Anfrage zu senden und die Antwort zu empfangen. Danach fragst du die Antwort über die read Funktion ab. Der read Funktion musst du mitgeben wie viel Zeichen der empfangenen Daten du lesen willst. Dazu musst du wissen wie lang die Antwort sein kann, hier nehmen ich mal 100 Zeichen an.

rs232.write(String('DISP:LANG?\r\n').toCharArray());
pause(1);
response = rs232.read(100);
disp(response);
ipcon.disconnect();

Das kann man jetzt noch effizienter machen, aber teste das erstmal so, um es ans Laufen zu bekommen.

Link zu diesem Kommentar
Share on other sites

Hallo Photron,

vielen Dank für deine ausführliche Antwort. Leider hatten wir auch mit deinen Änderungen kein Erfolg. Die Rückgabe ist immer noch leer. Egal welchen Befehl wir einsetzen.

Kann es sein, dass man noch einen Befehl benötigt, um die Kommunikation aufzubauen?

mit dem BrickViewer funktioniert es wunderbar, nur nicht mit Matlab.

Viele Grüße,

Claymars.

Tinkerforge_RS232_Example_20210312.JPG

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...