Matlab GUI由于项目的需要,需要学习的东西又复杂又浅。 在别忘了之前,写下重要的注意事项。
命令行窗口输入guide -空白GUI--
根据需要,拖动相应的工具以选择,如下图所示
双击每个对象可显示其复选框,以修改其属性、字体大小、粗细、位置等。 其中最重要的是两个。 一个是String,两个是Tag。 字符串用于修改对象中的字符,而Tag是要调用的代码名称。 这个好的代码习惯,你尽量看了就能得到。 例如,序列号使用portbutton等,在弹出菜单中输入字符串,并根据需要输入多行。 一般,习惯上用面板包围某个模块的各功能,设为上图的控制区域、发送区域、接收区域等
的拖动比较简单,接下来需要实现具体功能。 可以在对象上单击鼠标右键-显示回调callback导航到代码区域。
我实现的功能和代码主要包括以下部分
1 .打开/关闭串行端口
1.1右键单击“端口号com1”按钮,打开callback。 因为在打开串行端口之前必须选择对应的端口号。
functionppport _ callback (h object,eventdata,handles ) )。
%hobjecthandletoPPport(seegcbo ) )。
% event data reserved-tobedefinedinafutureversionofmatlab
% handlesstructurewithhandlesanduserdata (see guidata ) )。
% hints : contents=cellstr (get ) hobject,' String ' ) returnsppportcontentsascellarray
%contents{get(hobject,' Value ' ) } returns selected item from PP端口
全局端口
scoms=instrfind; %读取所有存在的端口
if~isempty(Scoms ) )。
停止同步(scoms ); 关闭(scoms; Delete(Scoms; %停止和删除串行对象
结束
vall=get(Handles.PPport,' Value ';
交换机价值
情况1
port='com1 ';
情况2
port='com2';
情况3
port='com3';
情况4
port='com4';
情况5
port='com5 ';
结束
其中,handles.xxx是抓取所单击的项,handles .后面跟要抓取的函数的函数名称。 上面的代码可以是端口号com1~com5之一,也就是说,tag会抓住ppPort中对象的值。
弹出式菜单中的字符串每行对应于case中的1到5,单击这些选项将执行“‘port=XXX”
1.2右键单击“打开串行端口”按钮以打开其callback函数
functionpbopenserial _ callback (h object,eventdata,handles ) )。
% hobjecthandletopbopenserial (seegcbo ) )。
% event data reserved-tobedefinedinafutureversionofmatlab
% handlesstructurewithhandlesanduserdata (see guidata ) )。
全球端口;
显示(端口)
Conm_num_str=port;
全球方案;
som=串行(conm _ num _ str );
Scom.InputBufferSize=2000; 设置buf空间,最多一个命令就足以返回数据存储
Scom.timeout=3;
Scom.BaudRate=115200;
Scom.DataBits=8;
Scom.Parity='none ';
Scom.StopBits=1;
Scom.ByteOrder='bigEndian ';
fopen(SCOM; 打开%串行设备对象
fprintf(openserialsuccess );
set(Handles.pbopenserial
,'enable','off');%打开串口的按钮变成灰色,不再可用这里需要注意的是如果想在不同的函数下用同一个变量,需要用global定义全局变量,并且在每一个要用到这个这个变量的函数中都用global 定义一下。在打开串口的函数中,串口号port调用于串口选择函数,串口配置Scom将会在关闭串口的函数中用到。
1.3右键“关闭串口”,选择callback。
function pbCloseSerial_Callback(hObject, eventdata, handles)
% hObject handle to pbCloseSerial (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.pbOpenSerial,'enable','on');%打开串口的按钮重新可用
global Scom;%全局变量Scom
display(Scom)
fclose(Scom);
delete(Scom);
2.串口收发
在打开串口之后,开始执行数据的收发,并在发送区和接收区显示
2.1串口通过发送区文本框以及“发送数据按”钮实现串口发送
function pbSend_Callback(hObject, eventdata, handles)
% hObject handle to pbSend (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global d
global Scom
global tmp_hex
d=get(handles.editS,'String');%editS为发送数据的文本编辑框,抓取里面的字符串
if(iscell(d))%这句是debug出了问题之后的修正,有时候输入的字符串会抓取为元胞数组,需要提取其字符串,如果抓取的值直接是字符串那就处理字符串,如果抓取的是元胞数组,就提取其字符串并处理
m=d{1};
else
m=d
end
display(d)
switch m
case {'PRESS','press'}
a=['01';'03';'xx';'xx';'xx';'xx';'xx';'xx'];%本代码采用modbus协议
data=hex2dec(a);%将16进制数字转换为10进制
fwrite(Scom,data);%将数据发送至串口
tmp_hex = fread(Scom,8)%接收单片机数据,并存入tmp_hex数组
tmp_int=tmp_hex(4)*256+tmp_hex(5);
tmp_dec=tmp_hex(6)*256+tmp_hex(7);
tmp_press=(tmp_int*1000+tmp_dec)/1000.0%保留三位有效数字
set(handles.editR,'string',['压力: ',num2str(tmp_press),'mN']);%将数组的值转换为字符串并在接收区显示editR为接收数据的文本编辑框
press=[ press,tmp_press];%将数据存入press数组中,以便在坐标系中绘制曲线
case ...
end
目前演示结果如下:
2.2发送区和接收区数据清空
function pbClearT_Callback(hObject, eventdata, handles)
% hObject handle to pbClearT (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.editS,'String','');
% --- Executes on button press in pbClearR.
function pbClearR_Callback(hObject, eventdata, handles)
% hObject handle to pbClearR (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.editR,'string','');
3 坐标系显示曲线
由于项目有多种待测量需要分时显示,故采用一个弹出式菜单来控制曲线绘制。
function ppCurveDisplay_Callback(hObject, eventdata, handles)
% hObject handle to ppCurveDisplay (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns ppCurveDisplay contents as cell array
% contents{get(hObject,'Value')} returns selected item from ppCurveDisplay
global ch
global press;%串口收发生成press数组
vall=get(handles.ppCurveDisplay,'Value');
switch vall
case 1
ch='xxx',axes(handles.axes1),plot(R2T,'g'),hold on,plot(R3T,'b'),plot(R4T,'r')...;
case 2
ch='侧向压力',cla,axes(handles.axes1),plot(press,'b'), grid on ,xlabel('SampleNum'),ylabel('Press/mN'),title(ch);%cla用于清空曲线,否则会出现曲线的叠加,坐标系的函数名为axes1,抓取该坐标系并对其进行操作
case 3
...
end
显示结果如下,当然由于未连接设备,采集到的数据均为0,故为一条press=0mN的直线。
Matlab GUI实现简单的很容易,但是在操作过程中会有各种各样的bug,需要慢慢探索研究……