Matlab R2016bでProScan IIコントローラとフィッティング電動ステージを制御したい。 Manual R2010bでテストしたところ、同じ結果が得られました。ステージの関連コマンドはVS(46ページ)、P(43ページ)、PS(44ページ)です。プレーンターミナルでは、ステージが停止した直後に、PまたはPSコマンドを発行して、X軸とY軸の現在の位置を返します。 Matlabのプロンプトで完了した場合は、適切な値を返す前に 'R'を返す必要があります - 前のコマンドのACKはinitの後に返されるため、前に発行されたR-ACKedコマンドはありません。別の.mファイルのスクリプトで使用すると、 'R'しか返せません。Matlabのシリアル通信の不一致
%Opening serial port
s = serial('COM9');
set(s,'BaudRate',9600,'Terminator','CR'); %Note that CR will be concatenated to all commands
fopen(s);
s %print for debugging
t=1 %loop index
while true
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Here is code to mess with a joystick that works fine, using VS command
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if button(joy, 3) == 1 %Button3 of joystick should trigger position reading
fprintf(s,'vs,0,0'); %Halt joystick movement
pause(1) %Debouncing
fprintf(s,'p'); %Axe-pos reading command
fgets(s) %Reading the answer
end
%This way to increment follows the skipped parts and is required for timing
if mod(t, 100)==0
fprintf(s,'%s',Command);
t=1;
else
t=t+1;
end
if..end内のセグメントは、MATLABプロンプトから起動された場合、それはほとんどの場合、正常に動作します:次のようにmain.mでの私のコードです。
>> s = openserial()
%properties as before, skipped to save space
>> fprintf(s,'ps');
>> fgets(s)
ans =
100000,100000
または
>> fprintf(s,'p');
>> fgets(s)
ans =
100000,100000,0
私はCtrl + Cであれば、無限ループのうちけどシリアル
>> fprintf(s,'p');
>> fgets(s)
ans =
R
オープンし、問題リターンを残します。 fgets()の代わりにfscanf()を使用すると、同じ結果が得られます。
fprintf()またはこれを引き起こす可能性のある既知のバグはありますか?私はスクリプト内で首尾よく一貫して読むために何ができますか?ご回答ありがとうございます。
解決策は、シリアル入力バッファを強制的にフラッシュし、一時停止(1)の前にフラッシュ入力することでした。私はまだそれがスクリプトの外でうまく働いた理由を知らないし、内ではない。 – navigator