2016-05-27 10 views
0

Ich mache ein Projekt, wo ich serielle Daten zwischen MATLAB und Arduino lesen und schreiben muss. Aber MATLAB liest Daten nicht immer erfolgreich. Ich habe Baudraten 9600 und meine Serien Setup ist wie folgt:Warum MATLAB nicht immer von der seriellen Schnittstelle lesen?

delete(instrfind({'port'},{comPort})); %%delete if COM4 is setup for any ther usesr 
obj=serial(comPort); 
set(obj,'DataBits',8); 
set(obj,'StopBits',1); 
set(obj,'BaudRate',9600); 
set(obj,'Parity','none'); 
set(obj,'InputBufferSize', 1024); 

MATLAB Daten sendet perfekt und Arduino es perfekt zu lesen. Aber ein Problem tritt auf, wenn ich warten möchte, um Daten von Arduino zu MATLAB zu lesen. Arduino sendet Daten durch diese Aussagen:

Serial.println("azyb"); 
Serial.flush(); 
    if (Serial.available()>0) // to clear the buffer 
     Serial.read();` 

Und Code-Anweisung in MATLAB ist:

while(1) 
    Arduino.ReadAsyncMode = 'continuous'; 
    % readasync(Arduino); 
    buf=Arduino.BytesAvailable; 
    if buf>0 
     bufData=bufData+fgets(Arduino); 
     bufFlag=strfind(bufData,'azyb'); 
     if isempty(bufFlag)==0 %%means 'azyb' is found in buffer 
      flushoutput(Arduino); 
      break; 
     end 
    end 
end 

Ich bin nicht sicher, aber wahrscheinlich ist es etwas, was ich in diesem Code verpassen. Was könnte ich falsch machen?

FYI: Interessanterweise funktionieren diese manchmal aber die meiste Zeit nicht. Besonders, wenn wir nur Arduino verwenden, aber die gesamte Schaltung nicht eingeschaltet ist, hat es im Allgemeinen funktioniert und wenn die gesamte Schaltung hochgefahren ist, funktioniert es nie.

+0

Möchten Sie, dass diese Frage von Ihnen auf Arduino.SE oder StackOverflow migriert wird? –

+0

Better StackOverflow dann Arduino.SE als ich denke, das Hauptproblem ist in Matlab – Anklon

Antwort

0

Das Problem ist die Synchronisation am wahrscheinlichsten. Sie sagen Matlab, den Puffer zu lesen, sobald seine Länge 3 überschreitet. Aber was ist, wenn es ein Zeichen (zB 'b') von der vorherigen Übertragung gibt, immer wenn der Arduino noch 4 sendet? Die ersten Zeichen im Puffer sind dann 'bazy' und stimmen nicht mit der erwarteten Zeichenfolge überein. Sie müssen über eine Synchronisationsmethode für Ihr Protokoll nachdenken, um diese Phänomene zu vermeiden.

+0

Arduino sendet 'azyb' so Puffer sollte dies (machte einige Änderungen im Code) und strfind() wird die Zeichenfolge 'azyb' finden, wenn es in der Zeichenfolge ist auch wenn es am Anfang oder in der Mitte ist. – Anklon

+0

Ja. Aber weil Sie es lesen, sobald es die Länge von vier erreicht, gibt es vielleicht nicht einmal eine "Mitte". Die serielle Kommunikation ist langsam. Matlab-Code ist schnell (gut, relativ) –

+0

Ich kann keine geeignete Methode finden, um diese Aufgabe zu erledigen. Kannst du irgendwas vorschlagen? – Anklon

1

Unten ist eine Funktion, die ich in einer Schleife anrufe, um mit meinen Daten umzugehen. Die wichtigsten Teile für Sie sind die Behandlung von Pufferunterläufen im Falle eines Timeouts. Sie können diese Zeit per Timeout erhöhen. Ich habe die Erfahrung gemacht, dass MATLAB mit der seriellen Kommunikation erstaunlich flockig ist.

function result=ser_read(serial_handle) 
timeout = 1000; 
for i=1:timeout 
    if(serial_handle.BytesAvailable~=0) 
    break; 
    end 
end 

if(serial_handle.BytesAvailable~=0) 
result = fread(serial_handle,serial_handle.BytesAvailable,'uint8'); 
else 
    fprintf('error, attempted read with no bytes available.'); 
    result=0; 
    return; 
end 

end 
+0

Was ist "s_result". Wenn last, wenn die Bedingung nicht wahr ist, ist s_result undefiniert, wenn Sie es nicht von woanders bekommen. Kannst du es bitte für mich klären? – Anklon

+0

@Anklon Dieses s_result stuff stammt aus einer String-Konvertierung, Sie können es also einfach entfernen. Ich werde den obigen Code bearbeiten. –

+0

vielen dank für ihre hilfe – Anklon

Verwandte Themen