Moin!
Wo genau klemmt's denn? Also das Grundprinzip ist folgendes: Mit
Code:
ser = serial('COM14', 'BaudRate', 9600, 'DataBits', 8, 'Parity', 'none', 'StopBits', 1, ...
'ReadAsyncMode', 'continuous', 'InputBufferSize', 64, 'OutputBufferSize', 64, ...
'Terminator' , 'CR/LF', 'BytesAvailableFcnMode', 'Terminator', 'BytesAvailableFcn', @bav);
wird ein serial-Objekt erzeugt, also eine Möglichkeit zum Senden oder Empfangen über die serielle Schnittstelle geschaffen. Im Beispiel ist es eben die COM14, die verwendet wird. Wenn du konkret eine andere "Datenquelle" hast - vermutlich nichtmal einen COM Port - musst du das natürlich entsprechend anpassen/ändern. So wie das Objekt erzeugt wird, triggert es einen sogenannten Callback, wenn immer im Datenstrom ein 'CR/LF' auftaucht. Der Callback heißt in diesem Falle bav (bytes available), ich übergebe dem serial-Objekt das Funktionshandle @bav der Funktion bav. Klingt vielleicht erstmal kompliziert, ist es überhaupt nicht. Was passiert ist einfach, dass die folgende Funktion bav immer aufgerufen wird, sobald Daten seriell angekommen sind (terminiert durch 'CR/LF')
Code:
function bav(obj, ~)
dat = str2num(fgetl(obj));
vals(2:500) = vals(1:499);
vals(1) = dat;
refreshdata(h1, 'caller')
end
die Zeile "dat = str2num(fgetl(obj));" holt nun die ASCII Daten und wandelt sie in einen numerischen Typ um (double), die Daten stehen dann in dat. Die von dir angefragte Animation ist jetzt ganz simpel gemacht. 500 Datenpunkte stehen im Vektor "vals" (der Vektor wird mit 500 Nullen initialisiert), die ersten 499 Werte werden im Vektor um eine Stelle nach hinten geschoben "vals(2:500) = vals(1:499);" und an die erste Stelle der neue Wert geschrieben "vals(1) = dat;". Der Clou beim Plotten ist jetzt, dass für den Plot "h1 = plot(vals);" mittels "set(h1, 'YDataSource', 'vals')" als Datenquelle für die y-Werte der Vektor "vals" angegeben wurde. Das hat zur Folge, dass wann immer "refreshdata(h1, 'caller')" anufgerufen wird, die Daten im Diagramm upgedatet werden. Das hat den Effekt, dass mit jedem Eintreffen eines neuen Datums über die Schnittstelle der Graph um eine Stelle verschoben wird. Bei einem kontinuierlichen Datenstrom führt das natürlich dazu, dass der Graph quasi durchs Diagramm scrollt, links immer der aktuellste Wert. Die Daten als ASCII zu empfangen ist natürlich nicht sehr elegant, bei niedrigen Datenraten funktioniert das aber eben sehr einfach. Vermutlich ist genau der Teil aber auch eh anders bei dir, ich wollte nur eine einfache Varinate zeigen, um das Scrollen zu bewerkstelligen.
Gruß
Malte
Lesezeichen