für die COM-munikation mit einem Messgerät habe ich folgenden Ablauf aufgestellt:
Code:
function almemo_drucksensoren(messanzahl) clc;
delete(instrfind({'Port'},{'COM5'}))
serial5 = serial('com5', 'DataBits', 8, 'Parity', 'none', 'StopBits', 1, 'BaudRate', 9600, 'Terminator', '3');
fopen(serial5);
tic for i = 1:messanzahl
% Anfordern einer einmaligen Ausgabe fwrite(serial5, 'S1') % Auslesen der einmaligen Ausgabe
almemo_messwerte = fread(serial5) % Umwandeln des Ergebnisses von dec in char
almemo_messwerte = num2str(char(almemo_messwerte'));
% Weglöschen der Leerzeichen
almemo_messwerte = strrep(almemo_messwerte, ' ', '') length(almemo_messwerte) % Separieren der Messzeit
almemo_time = almemo_messwerte(5:13) % Separieren des Messergebnisses von Kanal M02
messwert_M02 = almemo_messwerte(41:47) % Separieren des Messergebnisses von Kanal M03 (Umgebungsdruck)
messwert_M03 = almemo_messwerte(53:59) % Separieren des Messergebnisses von Kanal M10
messwert_M10 = almemo_messwerte(77:83) % Separieren des Messergebnisses von Kanal M11
messwert_M11 = almemo_messwerte(89:95) % Daten aus InputBuffer löschen und die Eigenschaft BytesAvailable auf 0 % setzen
flushinput(serial5) end toc fclose(serial5);
end
1. Ich habe kein TimeOut, sondern einen Terminator ('3') definiert, welcher ja scheinbar auch auftaucht. Warum wird mir aber dennoch ein TimeOut gemeldet bzw. warum wird der Terminator nicht gefunden, obwohl er doch eindeutig da ist (siehe oben) und alle erforderlichen Daten eingelesen wurden? Beim manuellen Hochsetzen eines TimeOuts von defaultmäßig 10 auf 20 oder 30 s wird übrigens dasselbe Ergebnis erzielt. Mein Problem ist nun natürlich, dass das alles viel zu langsam geht. Wenn ich den TimeOut nun verkürze (z. B. auf 1 Sekunde, dann klappt das vielleicht bei den ersten Schleifendurchläufen, aber irgendwann gibt es Ärger ('??? Index exceeds matrix dimensions.'), weil er nicht hinterherkommt. Aber genau für diesen Fall gibt es doch den Terminator, oder?
2. Wie kann ich aus dem Ergebnisstring meine Werte herausziehen, ohne eine derart umständliche Indizierung zu verwenden, also z. B. speichere mir die sieben Zeichen nach dem n-ten Doppelpunkt als eine Variable, welche die beiden Zeichen vor dem entsprechenden Doppelpunkt im Namen trägt?
Vielen Dank für eure Hilfe und einen angenehmen Nachmittag.
% Zeit des Almemo-Messgeräts mit Rechner synchronisieren
a = datestr(now);
a = a(13:20);
a = num2str([a(1) a(2) a(4) a(5) a(7) a(8)]);
fprintf(serial5, ['U' a]);
fscanf(serial5);
% Input Buffer löschen
flushinput(serial5)
% Anfordern einer einmaligen Ausgabe
%fwrite(serial5, 'S1') fprintf(serial5, 'S1');
pause(0.1) % Auslesen der einmaligen Ausgabe
%almemo_messwerte = fread(serial5);
almemo_messwerte = fscanf(serial5);
% Umwandeln des Ergebnisses von dec in char
%almemo_messwerte = num2str(char(almemo_messwerte'))
almemo_messwerte = num2str(char(almemo_messwerte)) pause(0.1) end toc fclose(serial5);
end
Ich habe es gelöst. Das Gerät hatte die COM-Schnittstelle nicht kontinuierlich mit Daten beschickt. Deshalb führte nich jede Abfrage seitens Matlab zum Erfolg. Nun habe ich am Gerät 'kontinuierliche Ausgabe' eingestellt und kann mit folgendem Code weiterarbeiten:
% Zeit des Almemo-Messgeräts mit Rechner synchronisieren
a = datestr(now);
a = a(13:20);
a = num2str([a(1) a(2) a(4) a(5) a(7) a(8)]);
fprintf(serial5, ['U' a]);
fscanf(serial5);
% Input Buffer löschen
flushinput(serial5)
zaehler = 1;
tic for i = 1:messanzahl
% Anfordern einer einmaligen Ausgabe fwrite(serial5, 'S1')
%fprintf(serial5, 'S1');
% Auslesen der einmaligen Ausgabe
almemo_messwerte = fread(serial5,123);
%almemo_messwerte = fscanf(serial5) % Umwandeln des Ergebnisses von dec in char
almemo_messwerte = num2str(char(almemo_messwerte'));
%almemo_messwerte = num2str(char(almemo_messwerte)) iflength(almemo_messwerte) == 123 % Weglöschen der Leerzeichen
almemo_messwerte = strrep(almemo_messwerte, ' ', '') length(almemo_messwerte) % Separieren der Messzeit
almemo_time{zaehler} = almemo_messwerte(6:13) % Separieren des Messergebnisses von Kanal M02
messwert_M02{zaehler} = almemo_messwerte(44:50) % Separieren des Messergebnisses von Kanal M03 (Umgebungsdruck)
messwert_M03{zaehler} = almemo_messwerte(56:62) % Separieren des Messergebnisses von Kanal M10
messwert_M10{zaehler} = almemo_messwerte(80:86) % Separieren des Messergebnisses von Kanal M11
messwert_M11{zaehler} = almemo_messwerte(92:98)
zaehler = zaehler + 1;
end % Daten aus InputBuffer löschen und die Eigenschaft BytesAvailable auf 0 % setzen
flushinput(serial5) end
zaehler
toc fclose(serial5);
end
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
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.