Claymars Posted February 25, 2021 at 01:24 PM Posted February 25, 2021 at 01:24 PM 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.m Quote
photron Posted February 26, 2021 at 11:21 AM Posted February 26, 2021 at 11:21 AM 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. Quote
Claymars Posted March 6, 2021 at 01:08 PM Author Posted March 6, 2021 at 01:08 PM 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 Quote
photron Posted March 8, 2021 at 10:44 AM Posted March 8, 2021 at 10:44 AM 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. Quote
Claymars Posted March 12, 2021 at 04:08 PM Author Posted March 12, 2021 at 04:08 PM 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. Quote
photron Posted March 12, 2021 at 04:18 PM Posted March 12, 2021 at 04:18 PM Moment, du hast auch dieses Problem hier: Laut diesem Thread kann man in MATLAB \r\n nicht so direkt hinschreiben. In Brick Viewer kannst du da aber einfach \r\n als Ende auswählen und da funktioniert es dann. Quote
Claymars Posted March 18, 2021 at 01:20 PM Author Posted March 18, 2021 at 01:20 PM Hallo photron, vielen Dank für deine Hilfe. Das war das Problem, jetzt funktioniert es. Viele Grüße Claymars Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.