Hallo, ich habe mich jetzt dumm und dämlich gegooglet und rumprobiert...ich sende etwas über den einen Serial Port an ein Messgerät...funktioniert auch...allerdings antwortet das Gerät nicht. Aus dem Protokoll werde ich auch nicht schlau. Es gibt leider keine offizielle Dokumentation zu dem Gerät. Mit einem Analyse-Tool habe ich schon den Datenverkehr angeschaut und gesucht, was die offizielle Herstellersoftware sendet. Dies habe ich kopiert, es funktioniert aber anscheinend nicht. Mein Matlab-Code: s = serialport("COM3", 9600); writeline(s, '3a 34 0a') out = readline(s); out data = read(s,5, "string"); data clear s Angehängt habe ich die Ausgaben der Analyse-Software. Inoffizielle Angaben zur Kommunikation: -------------------- Data transfer is done through RS232 and COM-port is emulated once USB is attached through UART protocol. Parameters of COM port: BaudRate = 19200 ByteSize = 8 Parity = NOPARITY StopBits = ONESTOPBIT fAbortOnError = TRUE Commands are ASCII symbols. Each command starts with ‘:’ and ends with (0x0A) The commands are: ‘2’ + parameters — setting the parameters parameters — first 32 time values for sensor measurement time (in 100 ms minus 1, e.g. for 200 ms this should be 2-1=1) in HEX (XX-two numbers, e.g. 1А or 0B); then the mask of the sensors that are turned on (eight-place HEX number — XXXXXXXX, each bit shows the turned on sensor; then the measuring interval in seconds (HEX four numbers — XXXX, it is importnat that the interval is set between the ending of the previous measurement and the start of the next, thus the measurement time has to be taken into account - sum(time values for each of the sensors)*0.1); finally goes "000000000000" ‘3’ — START (start of the measuremnets) -------------- Meine Frage nun: Wie werden die ASCII Anweisungen geschickt? Als Hex? Was ist da üblich, da anscheinend ":3" keine Messung startet. Schon einmal vielen Dank für Euere Antworten!
Erstmal die Baudrate stimmt nicht überein in deinem Code und der "Doku" s = serialport("COM3", 9600); != BaudRate = 19200 Es wäre vielleicht auch interessant was das für ein Gerät ist
Julius W. schrieb: > Meine Frage nun: Wie werden die ASCII Anweisungen geschickt? Als Hex? > Was ist da üblich, da anscheinend ":3" keine Messung startet. ASCII also einzelne Bytes. Diese können als Hex dargestellt werden. Julius W. schrieb: > s = serialport("COM3", 9600); Julius W. schrieb: > BaudRate = 19200 Deine Baudrate stimmt nicht. Julius W. schrieb: > writeline(s, '3a 34 0a') Habe kurz in die Matlab Doku geguckt. Bytes schreibt man mit write(s,Array mit Bytes, "uint8_t")
dd schrieb: > Erstmal die Baudrate stimmt nicht überein in deinem Code und der "Doku" Ja das stimmt, habe die nun angepasst! dd schrieb: > Es wäre vielleicht auch interessant was das für ein Gerät ist Das Messgerät bekommt eben den ASCII Code und startet dann eine Messung. Angeschlossen sind an dem Messgerät 32 Sensoren mit Membranen für z.B. den pH-Wert oder die NaCl-Konzentration. Zurückgegeben werden die Werte dann und werden "per Hand" in mV umgerechnet, da sie als ADC-Werte zurückgegeben werden. Baendiger schrieb: > ASCII also einzelne Bytes. Diese können als Hex dargestellt werden. Hättest du vielleicht mal von einer anderen Anfrage eine Hex-Folge? Muss ehrlich zugeben, das ich es als Hex-Folge ganz einfach mit "2D01…" geschrieben hätte. Verstehe deshalb auch nicht, wieso anscheinend das original Programm das genauso schickt.
Julius W. schrieb: > Hättest du vielleicht mal von einer anderen Anfrage eine Hex-Folge? Muss > ehrlich zugeben, das ich es als Hex-Folge ganz einfach mit "2D01…" > geschrieben hätte. Verstehe deshalb auch nicht, wieso anscheinend das > original Programm das genauso schickt. Ich benutze selber kein Matlab. Du wirst Matlab aber irgendwie mitteilen müssen das deine Zeichen hex sind. hiermit könntest du ein Array mit den hex-Zeichen befüllen und dann senden: https://de.mathworks.com/help/matlab/ref/serialport.write.html das willst du benutzen: https://de.mathworks.com/help/matlab/ref/serialport.writeline.html dort kannst du ASCII-Zeichen (bzw. Zeichenketten) übergeben
Ich hätte jetzt ganz simple eine Zeichenkette mit ASCII-Zeichen übergeben über writeline. Unabhängig von der Methode ist mir aber nicht klar, ob ich die Bytes einzeln oder eben als Zeichenkette übergeben muss. Wahrscheinlich gibt es auch keine Methode herauszufinden, wie genau die Kommandos ausschauen müssen oder?
Julius W. schrieb: > ob ich die Bytes einzeln oder eben als Zeichenkette übergeben > muss was ist denn da - bei einer seriellen Verbindung - der Unterschied?
Markus F. schrieb: > was ist denn da - bei einer seriellen Verbindung - der Unterschied? Ich bin leider in diesem Gebiet das erste Mal unterwegs und dachte, dass es da anscheinend Unterschiede gibt ??♀️ Ich hatte eigentlich vor, die Messwerte zu visualisieren und eben in der Qualitätskontrolle brauchbar zu machen. Im Prinzip müsste es dann ja so gehen, wenn ich einen ASCII als Zeichenkette sende? Vielleicht ist die Anfrage einfach falsch von mir ??♀️
Julius W. schrieb: > Commands are ASCII symbols. Each command starts with ‘:’ and ends with > (0x0A) Julius W. schrieb: > writeline(s, '3a 34 0a') Du sollst da nicht den Ascii-Code für den Doppelpunkt, sondern eben jenen (den Doppelpunkt) senden. Genauso mit der '3', die die Messung startet (abgesehen davon wäre der ASCII-Code von 3 sowieso 33 und nicht 34 gewesen). Von Leerzeichen im String steht da nix, oder? Der Kommandostring muss - wenn ich das auf die Schnelle richtig verstehe - für das Setzen der Parameter (":2...") mindestens 53 Zeichen lang sein...
Markus F. schrieb: > Du sollst da nicht den Ascii-Code für den Doppelpunkt, sondern eben > jenen (den Doppelpunkt) senden. Genauso mit der '3', die die Messung > startet (abgesehen davon wäre der ASCII-Code von 3 sowieso 33 und nicht > 34 gewesen). > > Von Leerzeichen im String steht da nix, oder? > > Der Kommandostring muss - wenn ich das auf die Schnelle richtig verstehe > - für das Setzen der Parameter (":2...") mindestens 53 Zeichen lang > sein... Würde ich so zustimmen. Markus F. schrieb: > was ist denn da - bei einer seriellen Verbindung - der Unterschied? Gibt keinen. Mein Beitrag sollte zwei Möglichkeiten zeigen.
Markus F. schrieb: > Du sollst da nicht den Ascii-Code für den Doppelpunkt, sondern eben > jenen (den Doppelpunkt) senden. Genauso mit der '3', die die Messung > startet (abgesehen davon wäre der ASCII-Code von 3 sowieso 33 und nicht > 34 gewesen) Achso, die 34 war auch nur der Test, eine Messung zu stoppen. (":4") Aber dann war ich gar nciht auf dem Holzweg bisher. Habe aber exakt diese Anfrage, wie von dir beschrieben, gestellt, sprich ":2......0x0A" und ":2..." .... prinzipiell eben genau die, wie sie in dem Screenshot als roter String zu finden ist. (:2....) Dann probiere ich nochmal, ob es am Lesen der Antwort des Gerätes liegt. Baendiger schrieb: > Gibt keinen. Mein Beitrag sollte zwei Möglichkeiten zeigen. Upps, dann hatte ich Dich nur falsch verstanden.
Julius W. schrieb: > Achso, die 34 war auch nur der Test, eine Messung zu stoppen. (":4") warum postest Du dann Code, von dem Du schon weisst, daß er falsch ist?
Markus F. schrieb: > warum postest Du dann Code, von dem Du schon weisst, daß er falsch ist? Weil ich ja wissen will, warum er falsch ist. Im Prinzip ist es ja egal, ob ich ne :3 oder :4 schicke ... Wenn es nicht geht, liegt es ja nicht an der Zahl selbst. Der Code an sich funktioniert ja (sprich kompilieren und ausführen)
Hallo! Ich habe keine Ahnung wieso, aber nun funktioniert alles, wie es soll. ------------------------------------------- s = serialport("COM3", 19200); writeline(s, ':3') n = 0; while n < 10 out = readline(s); out n = n+1; end clear s ------------------------------------------- Dieser Code funktioniert einwandfrei nun.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.