1、首先新建-->应用程序-->GUIDE。
2、绘制一个简单的UI。
3、然后右击“打开串口”图标-->查看回调-->callback,即可打开此图标的回调函数,此回调函数是press button时执行(可按需要选择其他回调)。
4、在回调函数中添加打开串口的代码。
delete(instrfindall); %删除所有串口
s3 = serial('COM3', 'BaudRate', 115200); %生成串口句柄
set(s3,'DataBits', 8, 'StopBits', 1, 'Parit', 'none', 'FlowControl', 'none'); %设置串口参数
s3.BytesAvailableFcnMode = 'byte'; %表示字节模式
s3.BytesAvailableFcnCount = 20; %20 bytes %收到20个字节就中断进入回调函数
s3.BytesAvailableFcn = {@My_SerialPort_Callback, handles}; %设置自己的回调函数(串口处理函数)。
try %尝试打开串口
fopen(s3);
disp('Open COM3'); %串口打开成功
catch
disp('Open COM3 faild'); %打开串口失败,串口不存在或串口被占用。
end
同时设置绘图函数,
GYRO_RAW_LX = plot(handles.axes1, gyro_axisX, gyro_raw_x, 'r', 'LineWidth', 1);
hold on; %不加无效
注:如果不加hold on,绘图曲线不会保持,将看不到曲线。
5、回调函数需新建My_SerialPort_Callback.m, 名称必须与上步设置的回调名称一致。
function My_SerialPort_Callback( hObject, BytesAvailable, p )
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
% 我是栗子
% plot(p.axes1, sin(1:0.01:25.99));
global Xlim sensor_raw_x gyro_axisX gyro_raw_x; %全局变量
data = fread(hObject,20,'uint8'); %读串口20字节,类型uint8
注:data(0)下标是从1开始的,不是从0开始。
%数据结构,协议自拟,以下是栗子。
%强制转换为int16
sensor_raw_x = typecast(uint16(data(3) * 256 + data(4)), 'int16');
Xlim = Xlim + 1; %更新坐标轴
gyro_axisX = [gyro_axisX Xlim]; %一维矩阵
gyro_raw_x = [gyro_raw_x, sensor_raw_x]; %一维矩阵
set(GYRO_RAW_LX, 'Xdata', gyro_axisX, 'Ydata', gyro_raw_x); %设置X,Y轴
set(p.axes1,'XLim',[Xlim-100 Xlim+20]); %移动坐标轴
end
到此应该可以串口绘图了。
6、想要让数值显示在很简单,在GUIDE中打开其中一个可编辑文本属性,找到Tag栏,填写自定义变量名,如Gyro_Xdata。之后在串口回调函数My_SerialPort_Callback.m里以下函数即可,其他数值显示操作相同。
set(p.Gyro_Xdata,'string',sensor_raw_x);
在“关闭串口”button callback中写入以下函数
%% 停止并删除串口对象
scoms = instrfind; %
fclose(scoms);
delete(scoms);
disp('Close COM3');
8、保存数据。
在“保存数据”button callback中写入以下函数
global gyro_raw_x;
filename1 = 'gyro_x_sample.xlsx';
A = [gyro_raw_x']; %转置
delete(filename1); %删除原有文件
fprintf('delete %s\r\n', filename1);
xlswrite(filename1,A,1,'A1');
fprintf('write %s done!\r\n', filename1);
之后点击保存数据按键即可保存,这里没有限制保存范围,收到多少数据就会保存多少数据。
这里保存为Excel表格,也可以保存为其他格式(TXT\CSV\CDF.........)。
9、OVER!