Klaro, hier ist der Code...:
Code:
clc
clear
try
rmappdata(0,'A');
rmappdata(0,'B');
%rmappdata(0,'C');
catch
end
s = serial('COM5','BaudRate',115200);
fopen(s);
s.BytesAvailableFcnMode = 'terminator';
disp('Ready...')
s.BytesAvailableFcn = @empfangen3D;
figure;
[x,y] = meshgrid(-50:50:50,-50:50:50);
z=[1 1 1; 0 0.1 0; -1 0 0];
h=surface(x,y,z);
axis equal;
xlim([-50 50])
ylim([-50 50])
zlim([-50 50])
view(0,30)
setappdata(0,'h',h);
%setappdata(0,'z',z);
Code:
function empfangen3D (s, event)
h=getappdata(0,'h');
A=getappdata(0,'A');
B=getappdata(0,'B');
%C=getappdata(0,'C');
%z=getappdata(0,'z');
try
string=fscanf(s);
k = strfind(string, 'A');
fff = strfind(string, 'B');
%zzz = strfind(string, 'C');
if k==1
A=str2num(string(2:end));
k=0;
end
if fff==1
B=str2num(string(2:end));
fff=0;
end
%if zzz==1
% C=str2num(string(2:end));
% zzz=0;
%end
z=[-A+B -A -A-B; 0+B 0 0-B; A+B A A-B];
catch
disp('error reading from serial...');
fclose(s)
end
setappdata (0,'A',A);
setappdata (0,'B',B);
%setappdata (0,'C',C);
%setappdata (0,'z',z);
try %ist die Figure geshclossen worden...
%wohl zu viel code für diesen "interrupt"...
set(h, 'zdata',z)
axis equal;
xlim([-50 50])
ylim([-50 50])
zlim([-50 50])
%view(C,30)
drawnow;
catch
fclose(s) %...dann wird serialport auch geschlossen.
disp('...something went wrong or figure was closed.....')
end
end
Wie man evtl. sieht ist das keine echte 3D Rotation. Aber mein Tricopter gibt auch keinen echten Winkel aus. Mal sehen ob ich das irgendwann noch ändere...
Goran, hast du eine Idee wie man den Code optimieren könnte? Im Moment macht das BytesAvailable Callback die ganze Arbeit, dabei soll es doch eigentlich nur die Daten vom Serialport abholen. Man müsste eine weitere Function einbauen, die nur das zeichnen übernimmt. Wie das geht weiss ich aber nicht.... Müsste eine Function sein, die z.B. alle 1/25 sekunden aus den vorhandenen Daten den Plot updated.
Denn es gibt Probleme wenn ich mehrere Datensätze übertrage, ich glaube das Callback ist dann überlastet.
edit:
mein µC sendet:
"A123" --> Nick
"B345" --> Roll
Lesezeichen