我想用Matlab R2016b控制Prior ProScan II控制器和配件电动平台。 Manual使用R2010b测试,得到了相同的结果。该阶段的相关命令是VS(第46页),P(第43页),PS(第44页)。在普通终端中,在阶段暂停后,我可以立即发出P或PS命令,返回X和Y轴的当前位置。如果在Matlab提示符下完成,它可能需要一两秒才能返回正确的值,然后返回' R' R' R' - 可能不是前一个命令的ACK,因为它在init之后返回,没有之前发出的任何R-ACKed命令。在单独的.m文件中的脚本中使用时,它只能返回' R'。我在main.m中的代码如下:
%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
如果从Matlab提示中调用if..end中的段,则在大多数情况下它都可以正常工作。
>> 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
回报。使用fscanf()而不是fgets()会产生相同的结果。
是否有任何已知的fprintf()或上面提到的错误导致此错误?我能做些什么才能在脚本中成功一致地阅读?谢谢你的回答。
答案 0 :(得分:0)
解决方法是在行暂停(1)之前强制刷新串行输入缓冲区flushinput(s)。出于某种原因,即使fscanf()而不是fgets()也没有刷新它。我仍然不知道为什么它在脚本之外工作正常但不在其中。此外,它还在一个单独的脚本中工作。