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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.