Forum: Mikrocontroller und Digitale Elektronik Serielle Daten in Matlab einlesen und speichern


von Sam H. (Gast)


Angehängte Dateien:

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

von Sam H. (sam_h)


Lesenswert?

Erfolgreich meine Frage am Ende vergessen:

Hat dabei Jemand mehr Wissen/Erfahrung und kann mir helfen das Problem 
zu lösen?
Kennt jemand eine andere Art die Daten einzulesen und abzuspeichern oder 
eine Möglichkeit den Code zu verbessern?

Gruß
Sam

: Bearbeitet durch User
von Stefan H. (cheeco)


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

von Sam H. (Gast)


Lesenswert?

Es hat geklappt, danke sehr!

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.