打开串口

% 获取所有串口            
all_com = serialportlist;
% 选择一个串口
SerialComName = all_com(1)
% 尝试打开串口
try
  % 根据所选串口创建对象
  Serial_Obj = serialport(SerialComName,115200);
  % 使用对象打开串口
  fopen(app.Serial_Obj);
  % 串口打开成功
  SerialComState = 1;
catch
  % 串口打开失败
  SerialComState = 0;
  % 删除串口
  delete(app.Serial_Obj);
end

APP Designer的变量导入工作区

% 将appdesigner中的变量Var的值导入到base的工作区,重新命名为VarName
assignin('base','VarName',Var);

Tab的切换

% 做某些操作后面板切换到app.SARTab的页面上
app.TabGroup.SelectedTab = app.SARTab;

全局变量

点击私有属性,代码框中出现

properties (Access = private)
        Serial_Obj;         % 选定的端口创建的对象
    end

然后在函数中通过如下的方式就可以使用或者修改Serial_Obj的值:

% 在别的函数中通过这个对象向串口发送0x01的数据
fwrite(app.Serial_Obj,0x01);

Matlab中的进制

Matlab中,不论写入几进制的数,软件都会将其转化成十进制存起来,好像根本就没有二进制、八进制和十六进制的思维。将正数28和负数-53分别转化成二进制数,会发现转化的结果是一串字符。

a = 25;
b = -53;

a_bin = dec2bin(a);
b_bin = dec2bin(b);
a_bin =

    '11001'

b_bin = 

    '11001011'

如果是正数,会得到一个位数不定但是恰好可以表示该数的二进制字符串,最高位为1;

如果是负数,会得到一个位数为4的整倍数的字符串,最高位为符号位,其余几位为负数的绝对值表示的二进制数取反加一后得到的字符串。

另外,可以规定变换后的二进制字符串的长度,由dec2bin(dec,length)第二个参数length决定。比如:

a_bin = dec2bin(a,8);

可以得到结果:

a_bin = 
    
    '00011001'

正数转换成二进制后还可以反变回十进制,如:

a_dec = bin2dec(a_bin);

可以得到:

a_dec = 

    25

然而,如果十进制数为负数,转换为二进制后,反过来使用bin2dec()函数却得不到原来的十进制的值。

b_rec_non = bin2dec(b_bin);

得到的却是:

b_dec_non =

   203

自己撰写代码,解出原值:

% 暂存字符转成的数据再取反
b_dec_vec = zeros(1,8);
for i = 1:8
    b_dec_vec(i) = ~str2num(b_bin(i));
end
% 再将向量转化成字符串
new = num2str(b_dec_vec(1));
for i = 2:8
    new = [new,num2str(b_dec_vec(i))];
end
% 拿字符串变回十进制
b_dec = -(bin2dec(new)+1);

从负数的反码变回十进制负数的方法就是,

(1)补码取反(变成首0);

(2)转换成对应的正数;

(3)加一再取反。

b_dec = 
    
    -53

感受

Matlab不适合做二进制的加法,更适合矩阵运算。