Matlab串口通信不一致

时间:2017-03-28 15:49:01

标签: matlab

我想用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()或上面提到的错误导致此错误?我能做些什么才能在脚本中成功一致地阅读?谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

解决方法是在行暂停(1)之前强制刷新串行输入缓冲区flushinput(s)。出于某种原因,即使fscanf()而不是fgets()也没有刷新它。我仍然不知道为什么它在脚本之外工作正常但不在其中。此外,它还在一个单独的脚本中工作。