Forum: Mikrocontroller und Digitale Elektronik Serial Port Device antwortet nicht - Matlab


von Julius W. (bootsneos)


Angehängte Dateien:

Lesenswert?

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!

von dd (Gast)


Lesenswert?

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

von Baendiger (Gast)


Lesenswert?

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")

von Julius W. (Gast)


Lesenswert?

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.

von Julius W. (Gast)


Lesenswert?

Erst einmal Danke für die Antworten! :D

von Baendiger (Gast)


Lesenswert?

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

von Julius W. (Gast)


Lesenswert?

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?

von Markus F. (mfro)


Lesenswert?

Julius W. schrieb:
> ob ich die Bytes einzeln oder eben als Zeichenkette übergeben
> muss

was ist denn da - bei einer seriellen Verbindung - der Unterschied?

von Julius W. (Gast)


Lesenswert?

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 ??‍♀️

von Markus F. (mfro)


Lesenswert?

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...

von Baendiger (Gast)


Lesenswert?

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.

von Julius W. (Gast)


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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?

von Julius W. (Gast)


Lesenswert?

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)

von Julius W. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.