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

Messdaten aus einer Zeile mit fscanf auslesen

 

SaFe
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2018, 17:27     Titel: Messdaten aus einer Zeile mit fscanf auslesen
  Antworten mit Zitat      
Hallo alle zusammen,

ich möchte gerne die Messdaten eines Ultraschallsensors mithilfe von Matlab auswerten. Der Sensor ermittelt die genaue Position des Objekts in dem Raum und gibt die Koordinaten aus. Meine Kenntnisse in Matlab liegen schon Jahre zurück, deshalb greife ich auf das Matlab-Forum zu.

Die Messdaten sind im Anhang wiedergelegt und hier gibt es einen kleinen Ausschnitt der Datei:

..P0000X0004Y0001Z0006V0078P0000X0-21Y0001Z0031V0058ES000001...

Die Koordinaten der Objekte werden in einer ganzen Zeile aufgelistet. P0000 beschreibt den Start des ersten Punktes. X0004 beschreibt den Punkt mit dem Wert 4 auf der X-Achse, dann folgt y=1 und z=6. V0078 sowie ES000001 sind für mich im Moment uninteressant. Es sind immer vier Zahlen oder drei Zahlen mit einem negativ Zeichen nach den Bezeichnungen P,X,Y und Z.

Mein Ziel ist es, die Punkte mit den entsprechenden Koordinaten auszulesen und in einer beliebigen Datei zu speichern, um sie später in einem 3D-Diagramm zu plotten.

Code:
% Meine ersten Schritte.
clear all
close all
clc

fid = fopen('Test-Messungen.txt');
fscanf(fid,'%s')
fclose(fid);


Leider komme ich hier nicht mehr weiter. Vielleicht kann mir an der Stelle jemand helfen.

Grüße
SaFe

Test-Messungen.txt
 Beschreibung:

Download
 Dateiname:  Test-Messungen.txt
 Dateigröße:  512 Bytes
 Heruntergeladen:  290 mal
Private Nachricht senden Benutzer-Profile anzeigen


SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 09:03     Titel:
  Antworten mit Zitat      
Du müsstest ja jetzt den String aufteilen in einzelne Blöcke, die dann X, Y, Z und so weiter entsprechen. Das könnte wie folgt funktionieren:

Code:

fileContent=fscanf(fid,'%s')
C = strsplit(fileContent,{'X','Y','Z','P','V'})


Anschließend musst du die verbleibenden Strings zu Zahlen konvertieren. Das geht dann beispielsweise mit str2double().
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFe
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 11:02     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort.
Konnte alle Ziffern außer die mit dem negativen Zeichen davor umwandeln. Bekomme bei dem Beispiel 0-21 den Wert NaN raus. Sollte eigentlich am besten -21 bei der Umwandlung stehen.

Code:
% Das ist der derzeitige Code.
clear all
close all
clc

fid = fopen('Test-Messungen.txt');
fc=fscanf(fid,'%s')
C = strsplit(fc,{'X','Y','Z','V','P'})
A = str2double (C)
fclose(fid);
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 11:10     Titel:
  Antworten mit Zitat      
Das folgende sollte funktionieren:

Code:
str2double(strip(C,'left','0'))
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFe
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 11:37     Titel:
  Antworten mit Zitat      
Danke. Es hat wunderbar funktioniert, jedoch beschäftigt mich noch eine Frage.
Wie schaffe ich es die Messwerte den jeweiligen Koordinaten X,Y und Z automatisch zuzuweisen ? Bei extrem vielen Messdaten wäre sowas vorteilhaft.
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 13:21     Titel:
  Antworten mit Zitat      
Zunächst einmal solltest du noch sicherstellen, dass eine '0000' auch als 0 übersetzt wird und nicht als NaN.

Dazu einfach folgendes an den Code anhängen:
Code:
A(isnan(A))=0; % überschreiben aller NaN mit 0


Anschließend kannst du deine X,Y und Z Werte etwa so auslesen:

Code:
X=A(1:6:end)
Y=A(2:6:end)


Das funktioniert so noch nicht bei dir, da die Werte nicht alle 6 Schritte auftauchen sondern mal nach 6 und dann wieder nach 5. Das müsstest du selbst nochmal rausfinden und anpassen. Falls es nicht klappt melde dich nochmal Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFe
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 17:17     Titel:
  Antworten mit Zitat      
Danke nochmals für die Tipps.
Ich habe vorhin nochmal gemessen und festgestellt, dass die Werte immer den gleichen Abstand besitzen. Im Anhang ist die neue Textdatei zusehen.
Konnte jetzt auch die Koordinaten problemlos auslesen und plotten.

Code:
% Script.
clear all
close all
clc

fid = fopen('Test-Messungen.txt');
fc  = fscanf(fid,'%s');
C   = strsplit(fc,{'S','P','X','Y','Z','V','ES'});
A   = str2double(strip(C,'left','0'));
A(isnan(A))=0;
S   = A(2);
P   = A(3:6:end);
X   = A(4:6:end);
Y   = A(5:6:end);
Z   = A(6:6:end);
V   = A(7:6:end);
ES  = A(8:6:end);

figure
hold on
grid on
plot3 (X,Y,Z,'r*')
legend('Messungen')
title('Beispiel Messung')
xlabel('x')
ylabel('z')
zlabel('y')
view([82,11])


fclose(fid);



Mein nächster Schritt wäre die Messungen mittels serial port auszulesen und einen realtime 3D-Plot zu programmieren. Nach meinem jetzigen Wissensstand sollte es analog wie beim Auslesen der Textdatei funktionieren. Dazu habe ich schon mal mit dem programmieren angefangen.

Code:

delete(instrfind);
sobject = serial('COM3','Baudrate',115200,'Timeout',100,'Terminator','LF');
sobject.InputBufferSize = 1000000;
fopen(sobject);
fscanf(sobject,'%s')
 


Bekomme jedoch hier nach 512 chars den Fehler : Warning: Unsuccessful read: The input buffer was filled before the Terminator was reached..

Habe nun mittels InputBufferSize den imputbuffer erhöht, jedoch ohne erfolg. Sind denke ich einfach zu viele Messdaten.

Test-Messungen.txt
 Beschreibung:

Download
 Dateiname:  Test-Messungen.txt
 Dateigröße:  502 Bytes
 Heruntergeladen:  269 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2018, 09:17     Titel:
  Antworten mit Zitat      
Bei der Frage kann ich dir leider auch nicht helfen. Aber ich würde dir empfehlen nochmal einen neuen Post zu machen. Das ist jetzt ein ganz anderes Thema als der Titel vermuten lässt Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
SaFe
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 01.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2018, 10:11     Titel:
  Antworten mit Zitat      
Alles klar. Danke dir für die hilfreichen Informationen Very Happy
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 - 2024 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.