Serielle Daten in Matlab einlesen und speichern

Gast #6948606
Lesenswert?

Guten Tag,

Ich muss für mein Projekt Weg-Daten aus einem Messgerät(Heidenhain 
VRZ406) über eine serielle Schnittstelle auslesen.
Um Daten zu senden muss das Messgerät das Steuersignal STX (Dezimal 2) 
gesendet bekommen, dies habe ich mit einem Arduino + Max232 Einheit 
realisiert. Das läuft auch alles Problemlos.

Mein Problem liegt beim einlesen bzw. speichern der Daten vom Messgerät 
in Matlab, eher gesagt in der Geschwindigkeit, da nicht alle vom 
Messgerät übersendeten Daten erfasst werden.

Das Messgerät sendet mit einer Baudrate von 2400, 7 Databits, even 
Parity und 2 Stopbits.
Über HTerm habe ich als Nachrichten vom Messgerät folgendes erhalten:
'+   0.007?/r/n' (hinter dem '+' sind 3 Leerzeichen in der Nachricht)

Ich habe den Folgenden Code dafür rausgesucht und auf meinen 
Anwendungsfall abgeändert:
1
if ~isempty(instrfind)
2
    fclose(instrfind);
3
end
4

5
%Serielle Schnittstelle einrichten
6
ser=serial('COM2');
7
disp('Serialobjekt erzeugt');
8
set(ser,'BaudRate',2400);
9
set(ser,'DataBits',7);
10
set(ser,'Parity','even');
11
set(ser,'StopBits',2);
12
set(ser,'ReadAsyncMode','continuous');
13
set(ser,'Terminator','CR/LF');
14

15
fopen(ser);
16
disp('Serialobjekt geöffnet')
17

18
filename = sprintf('Log%s.txt','Data');
19

20
fileID = fopen(filename,'wt');
21

22

23
while (1) %Abfrage
24
    
25
    disp(fgetl(ser));
26

27
fprintf(fileID,fgetl(ser));
28
fprintf(fileID,'\n');
29
end
30
fclose(fileID);
31
fclose(ser);

Codequelle: Beitrag "Re: Serielle Schnittstelle (COM) mit MATLAB aufzeichnen/auslesen"

Dieser Code funktioniert auch soweit, bis auf dass ich die Funktion 
Manuell pausieren bzw. abbrechen muss um den durchlauf zu beenden. (ist 
für mich allerdings nicht allzu schlimm, da die Daten trotzdem 
gespeichert sind)

Mein Problem dabei ist, dass dieser Code zu langsam ist oder irgendwie 
Fehler ausweist, denn mein Messegerät gibt 2 Werte aus während der Code 
nur einen aufnimmt und abspeichert, was zu einer falschen Auswertung 
führt.

Bei HTerm bekomme ich auch alle Nachrichten aufgezeigt, also sollte 
etwas an dem Code nicht richtig sein.

Im Anhang in nochmal ein Bild von den Nachrichten in HTerm und Die Log 
datei die am Ende rauskommt.

Danke im voraus!

Gruß
Sam
Angehängte Dateien:
#6948680
Lesenswert?

Vielleicht ist es ganz einfach. Jedes fgetl(ser) liest einen neuen 
String ein. Deswegen zeigst du einen String an, und den darauffolgenden 
speicherst du usw. Dadurch hast du nur die Hälfte der Strings in deiner 
Datei. Ändere mal folgendes:

Von:
disp(fgetl(ser));
fprintf(fileID,fgetl(ser));

Zu:
rcv = fgetl(ser);
disp(rcv);
fprintf(fileID,rcv);

Hoffentlich war es das :-)

Stefan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren