有时候在调试一些单片机等外设时,现有的串口软件往往不能胜任我们数据处理的需求。而自己写一个上位机软件实在是小题大做了。
那么 MATLAB 其实时支持从串口读取数据的,再借助 MATLAB 强大的数据处理与分析函数,就能实时可视化传感器等数据了。
MATLAB 基础可以参考我之前的文章 『MATLAB 学习笔记』导航 & 资源 & 笔记
MATLAB 串口通信
MATLAB 本身是支持 Serial Port Devices,即串口设备。通过自带的一些函数可以操作串口(读取、写入等)
官方英文教程
然而在实际使用中,我的和官方给出的例子有一些不同。
下面给出一个完整的串口读取的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| % 新建串口对象
s1=serial('COM15','BaudRate',9600);
% 尝试代开串口
try
fopen(s1); % 打开串口对象
catch err
fclose(instrfind); % 关闭被占用的串口
error('请确认选择了正确的串口'); % 输出错误提示
end
a=fscanf(s1,'%d'); % 读取数据
fclose(s1); % 关闭串口
|
MATLAB 动态绘图
要实现读取一个数据,然后实时更新图像。而不是已知所有点坐标再进行绘图。
动态曲线
1
2
3
4
5
6
7
8
9
10
11
12
| h = animatedline; % 创建空白动态曲线
axis([0 40 5 30]) % 设置坐标系范围
x = linspace(0,40,800);
xlabel('时间');
ylabel('距离');
for k = 1:length(x)
y =(fscanf(arduino,'%d')/100.0);
addpoints(h,x(k),y);
drawnow
end
|
可以实现从串口实时读取数据并进行显示。最终效果类似心电图。
动态点坐标
这个挺头疼的。因为我不需要两点之间连线,而是类似随机的散点。
最终用 clf 的命令解决了问题。代码如下
1
2
3
4
5
6
7
8
9
| n = 500;
for i = 1:n
clf; % 清空
a =(fscanf(s1,'%d')/100.0);
b =(fscanf(s2,'%d')/100.0);
plot(px,py,'or','MarkerSize',5,'MarkerFaceColor','r');
axis([0 40 0 40]);
drawnow;
end
|
还有其他动态绘图的方法,比如 comet()
函数、hold on 等用法。可以自行百度。但我之所以不采用这些方法的原因是因为它们的坐标系是会变化的,不固定。
MATLAB 初学者,若有不足,请指正。