本文具体介绍app设计的过程,该app接收的数据格式是16位整形数,分byte以字符方式打印。打印U16变量var,打印格式为
printf("%c%c\n",U8(var>>8),U8(var));
app设计如下
1. 选择串口
使用下拉框控件
![](https://i-blog.csdnimg.cn/blog_migrate/7703815961c1a02e84cf89af2e1450f8.jpeg)
也可以选中控件后,通过右下角的属性修改。这里我们修改一下控件的name “DropDown”,修改为“COM”
这里可以添加多个串口,如“COM2,COM3…… ”,也可以通过读取电脑识别到的串口,赋值给app.COM.Items
try
fclose(instrfind);
catch
end
Ports = instrhwinfo('serial');
app.COM.Items=flipud(Ports.SerialPorts);%COM1一般为电脑自己的串口,这里把串口数从大到小排列赋值给COM
该段代码我们我们在启动函数startupFcn()中实现
startupFcn函数内可以添加其他初始化操作,当然你也可以把这些初始化封装起来。如下定义 函数COMInitialFun(),并在startupFcn()中调用
2. 选择波特率
操作类似 选择串口同样使用下拉框控件,这里勾选了“允许用户键入文本”,防止可选波特率无法覆盖实际需求
3. 串口状态控制
先在app属性中添加名为“SERIAL”的串口对象
选用Button控件进行串口状态控制,将控件名改为“SerialSts”和标签修改为“Open”;选用TextArea控件监控串口状态,将控件名改为“SampleSts”
右键Open 控件或者在右下的属性里增加回调函数SerialStsButtonPushed()
回调函数SerialStsButtonPushed(app)
try
fclose(instrfind);
catch
end
if strcmp(app.SerialSts.Text,'Close')
try
fclose(app.SERIAL);
app.SerialSts.Text='Open';
app.SampleSts.Value=[app.SampleSts.Value(2:end);['关闭',app.COM.Value,'成功']];
catch
app.SampleSts.Value=[app.SampleSts.Value(2:end);['关闭',app.COM.Value,'失败']];
app.SerialSts.Text='Close';
end
delete(app.SERIAL);
else
try
app.SERIAL=serial(app.COM.Value,'baudrate',str2num(app.Baud.Value));
app.SERIAL.BytesAvailableFcnCount = 3;
set(app.SERIAL,'BytesAvailableFcnMode','byte'); %设置中断触发方式terminator
set(app.SERIAL,'BytesAvailableFcn',{@app.ReceiveSerial});
fopen(app.SERIAL); %打开串口
app.SerialSts.Text='Close';
app.SampleSts.Value=[app.SampleSts.Value(2:end);['打开',app.COM.Value,'成功']];
catch
app.SampleSts.Value=[app.SampleSts.Value(2:end);['打开',app.COM.Value,'失败']];
app.SerialSts.Text='Open';
fclose(app.SERIAL);
delete(app.SERIAL);
end
end
定义串口中断函数ReceiveSerial,其中中断函数需要添加形参src和event
function ReceiveSerial(app,src,event)
data = fread(app.SERIAL,3);
if data(3) == 10 %10——换行符对应的ASICII码
dataPrint = data(1)*256+data(2);
app.SampleSts.Value=[app.SampleSts.Value(2:end);num2str(dataPrint )];
else
app.WaitCount=app.WaitCount+1;
app.WaitCount=mod(app.WaitCount,100);
app.SampleSts.Value=[app.SampleSts.Value(2:end);['Waiting',num2str(app.WaitCount)]];
pause(1);
end
end
这里我们给app.SampleSts.Value进行初始化并在启动函数中调用,定义打印数据的长度,同时新增等待计数变量WaitCount,在初始化函数中初始化,
app.SampleSts.Value={'';'';'';'';'Initial'};
app.WaitCount=0;
源码在我的上传资源中SerialApp.mlapp