2016-06-17 4 views
0

Matrix Sensor 1610にKitronyx Snowboard(Arduino Leonardoを使用しています)を使用しています。シリアルポートから自分のデータをMatlabに直接読み込んで可視化したいと考えています。ArduinoからMatlabへのリアルタイムデータのインポート。 BufferSizeとは何ですか?なぜ遅延するのですか?

私は、関連すると思う2つの問題があります: まず、私はマトリックスを読むことができますが、遅れがあります。長い私は遅延を長く待つ。すべての

第二に、しばらくして、私はいつも買ってあげる:シリアル/ fprintfのを使用して

エラー(ライン144)

予期しないエラー:タイムアウトが書き込み操作中に発生した。..

InputBufferSizeが大きければ長いほど私のデータをプロットすることができます(問題1のために問題はありません)

どのように便利なバッファサイズがわかりますか?なぜ誰が遅延とどのように私はそれを取り除くことができますか?

は、事前にどうもありがとうございます

マイク

close all     %close all figures 
clear all     %clear all workspace variables 
fclose('all')    %close all Files 
delete(instrfindall)  %Reset Com Port 
delete(timerfindall)  %Delete Timers 

% setup serial 

serialPort = serial('COM3'); 

command = 'A'; 

nrow = 16; 
ncol = 10; 
row_index = [9,10,11,12,13,14,15,16,8,7,6,5,4,3,2,1]; 
col_index = [1,2,3,4,5,6,7,8,9,10]; 

% 10x16 = 160 bytes 
lendata = 160; 
BaudRate = 11520; 
InputBufferSize = 115200; 
Timeout = 5; 
set(serialPort , 'BaudRate', BaudRate); 
set(serialPort , 'InputBufferSize', InputBufferSize); 
set(serialPort , 'Timeout', Timeout); 

fopen(serialPort); 

while 1 

% Request data 
fprintf(serialPort, command); 

% Get data 
%Data is read as string (CSV) 
data_string = fgets(serialPort); 
data_string_array = strsplit(data_string, ','); 
data = str2double(data_string_array); 

% Reshape data (1D -> 2D array) 
data2d = zeros(nrow, ncol); 
k = 1; 
for i = 1:nrow 
    for j = 1:ncol 
     data2d(row_index(i), col_index(j)) = data(k); 
     k = k + 1; 
    end 
end 

%resize 16x10 image to 160x100 image 
data2d_resized = imresize(data2d,50); 
imshow(data2d_resized,[0 100]); 

end 
+0

あなたが「もっと長く私が待ちます」と言うとき、待ち時間が長くなるとタイムアウトが長くなることを意味しますか? – RPM

+0

私はあなたが制御している機器が終了文字を期待しているか、またはMatlabが検知していない終了文字を送信していると推測する危険があります... – RPM

+0

いいえ私は最初の10秒を意味しません。例えば、1分後よりも遅れている。だから私は長く私のコードを実行している私は私のセンサーからの応答を見るのを待つ必要があります。私は別の行列を次々に得ています。終了文字に何らかの問題があった場合、私の行列はスクランブルされませんか?どのようにそれを検出しますか?助けてくれてありがとう? –

答えて

1

私たちは決定的な答えを与えるために十分な情報を持っているとは思わないが、いくつかの考慮事項があります。

1)入力バッファは、シリアルポートで受信されたデータを保持するために確保されたメモリです。 readステートメント(fgets(), fread()など)でデータを削除するまで、データはバッファに格納されます。バッファサイズが、読み出しサイクル(以下を参照)の間に受け取るデータの量よりも大きく、利用可能なRAMに比べて小さい場合、問題にはなりません。

2)コマンドfgets()は、文字列の行終端文字を返します。これらの文字は必要ありません。代わりにfegtl()またはfscanf()を使用することを検討してください。

3)あなたが記述した症状は、Arduinoが各繰り返しでより多くのデータを送信しているように聞こえるか、Matlabプログラムが処理できる速度よりも速くデータを送信しているようです。あなたのコードは、予想以上に多くのデータが到着した場合、入力バッファがいっぱいになり、物事がクラッシュするまで気付かないように書かれています。 入力バッファー(disp(serialPort.BytesAvailable))のデータのサイズと各繰り返しで返される文字列の長さを印刷してみてください。

これが問題であれば、いくつかのフロー制御を実装しなければならないかもしれません.Matlabプログラムが文字をArduinoに送って、より多くのデータを準備できるようにしてください。または、1つのラインだけでなく、各読み取りサイクルで入力バッファからすべてのデータを読み込みます。

4)matlabの実行速度が問題の場合は、 "Reshape"ループをreshapeコマンドに置き換えることを検討してください。 forループは、組み込み関数より常に遅いです。

+0

ありがとうございます。あなたはまさに正しいです。 InputBufferSizeはますますいっぱいでした。だから、私はループの最後に(serialPort)flushinputを置くとうまくいくようです。 –

関連する問題