WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Serielle Schnittstelle schneller auslesen

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 23.07.2012, 16:15     Titel: Serielle Schnittstelle schneller auslesen
  Antworten mit Zitat      
Liebe Leute,

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
 


Als Rohmaterial erhalte ich:

Zitat:

Warning: The specified amount of data was not returned within the Timeout period.

almemo_messwerte =

83
49
13
10
15
49
53
58
53
50
58
51
54
32
48
48
58
32
43
48
48
48
50
46
48
32
109
115
32
48
49
58
32
43
48
48
48
49
46
56
32
109
115
32
48
50
58
32
45
48
48
48
48
46
49
32
80
97
32
48
51
58
32
43
49
48
48
51
46
52
32
109
98
32
48
52
58
32
45
48
48
48
48
46
50
32
109
115
32
49
48
58
32
43
48
48
48
48
46
48
32
80
97
32
49
49
58
32
43
48
48
48
50
46
50
32
80
97
32
18
13
10
3


almemo_messwerte =

S1

15:52:3600:+0002.0ms01:+0001.8ms02:-0000.1Pa03:+1003.4mb04:-0000.2ms10:+0000.0Pa11:+0002.2Pa



Nun meine Fragen:

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.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen


pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 24.07.2012, 12:36     Titel:
  Antworten mit Zitat      
Mittlerweile habe ich gelesen, dass man fread nicht mit einem Terminator benutzen kann.

Meine Funktion könnte ich aber auch mit fprintf und fscanf bestücken:

Code:

function almemo_drucksensoren(messanzahl)
clc;
delete(instrfind({'Port'},{'COM5'}))
serial5 = serial('com5', 'DataBits', 8, 'Parity', 'none', 'StopBits', 1, 'BaudRate', 115200);

fopen(serial5);

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

tic
for i = 1:messanzahl
   
    % 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
 


jetzt in eine Schleife packe, so liest er mit
Code:
almemo_drucksensoren(5)
folgendes aus:

Zitat:

almemo_messwerte =

S1

almemo_messwerte =


almemo_messwerte =

12:29:53 00: +0002.0 ms 01: +0001.9 ms 02: +0000.0 Pa 03: +0997.8 mb 04: -0000.1 ms 10: +0002.4 Pa 11: +0002.2 Pa 

almemo_messwerte =

S1

almemo_messwerte =

Elapsed time is 0.564131 seconds.


Ich weiß mir hier einfach nicht zu helfen. Hat jemand eine Idee? Das Verändern der Baudrate hat keinen signifikanten Einfluss.

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 25.07.2012, 09:40     Titel:
  Antworten mit Zitat      
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:

Code:

function almemo_drucksensoren(messanzahl)
clc;
delete(instrfind({'Port'},{'COM5'}))
%serial5 = serial('com5', 'DataBits', 8, 'Parity', 'none', 'StopBits', 1, 'BaudRate', 9600, 'TimeOut', 0.8);
serial5 = serial('com5', 'DataBits', 8, 'Parity', 'none', 'StopBits', 1, 'BaudRate', 9600);

fopen(serial5);

% 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))
    if length(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
 


Trotzdem danke und beste Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.