2016-05-27 27 views
0

私は、MATLABとArduinoの間でシリアルデータを読み書きする必要があるプロジェクトを行っています。しかし、MATLABは常にデータを正常に読み取るわけではありません。私はボーレート9600を設定して、私のシリアルセットアップは、このようなものです:MATLABがシリアルポートから読み込むとは限りません。

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は完全にデータを送信し、Arduinoのは完全にもそれを読んで。しかし、問題はarduinoからMATLABにデータを読み込むのを待っているときに発生します。 Arduinoのは、このステートメントを介してデータを送信します:MATLABで

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

、コード文は次のとおりです。

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 

私はよく分からないが、おそらく、私はこのコードで欠場ものがあります。私は何が間違っていますか?

FYI:興味深いことに、これは時々動作しますが、ほとんどの時間は動作しません。特にArduinoのみを使用しているにもかかわらず、トータル回路の電源が入っていない場合は、一般的に動作し、トータル回路の電源投入時には動作しません。

+0

Arduino.SE、またはStackOverflowに移行したあなたの質問をお聞かせください。 –

+0

私は主な問題はmatlabにあると思うので、Arduino.SEを改善してください – Anklon

答えて

0

問題は、同期が最も可能性があります。 Matlabに長さが3を越えるとすぐにバッファを読みとるように指示しています。しかし、Arduinoが別の4を送信しているときは、以前の転送から1文字(たとえば'b')が残っていますか?バッファーの最初の文字は'bazy'になり、期待される文字列と一致しません。これらの現象を避けるためには、プロトコルの同期方法について考える必要があります。

+0

Arduinoは 'azyb'を送信してバッファにこれを(コードにいくつかの変更を加えて)入れるようにして、strfind()は文字列中に 'azyb'という文字列を見つけますたとえそれが最初か中間にあったとしても。 – Anklon

+0

はい。しかし、あなたはそれが4の長さに達するとすぐにそれを読んでいるので、「中間」さえないかもしれません。シリアル通信が遅い。 Matlabコードが高速です(よく、比較的) –

+0

私はこの仕事を行うのに適した方法を見つけることができません。あなたは何かを提案できますか? – Anklon

1

以下は、データを処理するためにループで呼び出す関数です。タイムアウトが発生した場合のバッファアンダーフローの処理には、重要な部分があります。この時間をタイムアウトで増やすことができます。私の経験では、MATLABはシリアルコミュニケーションでフレークですごいです。

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

"s_result"とは何ですか?条件が真でない場合は、s_resultは他の場所から取得しないと定義されません。私のためにそれをクリアしてもらえますか? – Anklon

+0

@Anklonこのs_resultは文字列変換のものなので、削除することができます。私は上記のコードを編集します。 –

+0

ありがとうございました – Anklon

関連する問題