2016-03-21 16 views
0

ich Matlab bin mit Befehlen fopen, fwrite und fscanf zwischen zwei Laptops mit dem folgenden Code eine Reihe von Kommunikation über serielle Schnittstelle zu öffnen:Aufzeichnung der Zeit während der Kommunikation über serielle Schnittstelle in Matlab

auf dem Laptop # 1:

portID='/dev/tty.USA28Z145P2.2' 
    s=serial(portID) 
    fopen(s) 
    fwrite(s,'67') 

auf dem Laptop # 2:

s=serial('COM3') 
    fopen(s) 
    out=fscanf(s) 

Von dem Skript, das ich ausführe, ist der fwrite manchmal 67 und manchmal 83. Out kann alle diese aufzeichnen.

Ich versuche einen Weg zu finden, um den genauen Zeitpunkt aufzuzeichnen, zu dem jede fscanf auftritt, ist das möglich? Ich sammle einige andere Daten und diese Befehle laufen, während die Datenerfassung stattfindet, und ich muss einen Weg finden, um die Zeit aufzuzeichnen, wenn jede fscanf auftritt, damit ich sie mit meinen anderen Daten synchronisieren kann.

Für z.B. Wenn der COM3-Anschluss '67' scannt, muss ich wissen, zu welchem ​​Zeitpunkt genau dies der Fall ist, da '67' für meine Datensammlung den Beginn einer 12-Sekunden-Periode bedeutet.

Weiß jemand, wie man das macht? Irgendwelche Vorschläge würden sehr geschätzt werden!

Danke,

Maheen

+0

Was haben Sie versucht, so weit? Warum schnappst du dir nicht einfach die aktuelle Zeit, wenn du 'fscanf' über' clock', 'now', etc anrufst? – Suever

+0

Erwarten Sie außerdem, dass MATLAB die Daten aus mehreren Quellen in Echtzeit erfasst oder unterschiedliche Systeme alle unterschiedlichen Daten erfassen? – Suever

+0

@Suever Matlab erfasst Daten aus einer einzigen Quelle. Es ist ein Spektrometer, das auch über eine serielle Schnittstelle angeschlossen ist. Ich habe versucht, Uhr in meinem Skript zu verwenden, aber es gibt mir das Datum und die Zeit usw. aber überschreibt alle vorherigen Erwerbungen. Ich benutze es wie folgt: 'out = fscanf (s); c = Uhr 'und dann prüfen, was out und c sind. out notiert alle Werte von Anfang an, aber die Uhr nicht –

Antwort

1

Sie werden nie eine zeitliche Präzision erreichen, die ich genau nennen würde, weil der Software-Stack (MATLAB + Betriebssystem) -Funktionen keine Echtzeit hat.

Wenn Sie nach einer Möglichkeit suchen, eine Taktgenauigkeit zu erzielen, die normalerweise innerhalb eines 0,1s-Fehlerfensters liegt, verwenden Sie den Rückruf des seriellen Objekts BytesAvailableFcn.

würde die Konfiguration

s=serial('COM3') 
[email protected] 
s.BytesAvailableFcnCount=1 
s.BytesAvailableFcnMode='byte' 
fopen(s) 

sein Wo myCallback ist eine Funktion, die Sie implementieren müssen, welche immer dann, wenn Bytes verfügbar sind aufgerufen wird.

function myCallback(obj,event) 
    disp(event.Data.Time); %print time data is received 
    %obj is your serial object, use existing code to read. 
end 

Further details in the documentation

+0

Danke für Ihre Antwort. Ich versuche zu verstehen, wie ich diese Funktion in meinem Skript verwenden würde. Um es einfach auszudrücken, möchte ich den Zeitpunkt erfassen, zu dem jede "67" oder "83" gescannt wird, da dies den Beginn einer Zeitperiode bedeutet. –

+0

@MaheenSiddiqui: Ich habe einen Beispielcode hinzugefügt. – Daniel

+0

Danke dafür, das ist sehr nützlich, genauso wie die Dokumentation! Ich werde es versuchen, wenn ich morgen alles wieder aufgebaut habe. –