Matlab GUI上位机界面实现串口通信

Matlab GUI因项目需求,不得不学的又杂又浅,趁着还没彻底忘记,写下来一些关键注意点。

命令行窗口输入guide→Blank GUI→确定

根据自己的需求,拖动选择对应的工具,如下图所示

双击每一个对象,就可以弹出其检查器,修改其属性,字体大小、粗细、位置等,其中最关键的是两个,一是String,二是Tag,String是用来修改对象中的文字,Tag是所调用的代码名,这个要好的代码习惯,尽量所见即所得,比如串口按键就用portbutton等。弹出式菜单的String,根据需要输入多行。一般来说,习惯用面板将某一个模块的各个功能圈起来,如上图的控制区、发送区、接收区等

 界面的拖动相对比较简单,接下来就需要实现具体的功能,右键对象→查看回调→callback,即可调到代码区。

 我实现的功能及代码主要包括以下部分

1.串口打开与关闭

1.1右键“端口号com1”的按钮,打开callback。因为在打开串口之前需要选择对应的端口号。

function ppPort_Callback(hObject, eventdata, handles)
% hObject    handle to ppPort (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 ppPort contents as cell array
%        contents{get(hObject,'Value')} returns selected item from ppPort
global port
scoms = instrfind; %读取所有存在的端口
if ~isempty(scoms)
    stopasync(scoms); fclose(scoms); delete(scoms);%停止并且删除串口对象
end
vall=get(handles.ppPort,'Value');
switch vall
    case 1
        port='com1';
    case 2
        port='com2';
    case 3
        port='com3';
    case 4
        port='com4';
    case 5
        port='com5';
end

这里handles.xxx是抓取所点击的项, handles.后面的为所抓取函数的函数名,上述代码抓取端口号com1~com5中的一个,也就是tag为ppPort的对象的值。

在弹出式菜单的String里每一行对应于case的1~5,点这些选项对应执行‘port=xxx’

1.2右键“打开串口”的按钮,打开其callback函数

function pbOpenSerial_Callback(hObject, eventdata, handles)
% hObject    handle to pbOpenSerial (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global port;
display(port)
Conm_num_str = port;
global Scom;
Scom=serial(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("open serial success");
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,需要慢慢探索研究…… 

MATLAB是一款功能强大且广泛应用的科学计算软件,在很多工程领域都有广泛应用。MATLAB还可以通过串口进行通信,实现与设备的数据传输,在工业自动化、控制系统等领域有着广泛的应用。 实现MATLAB串口通信,需要首先配置串口参数,包括设置波特率、数据位、校验位、停止位等。然后,通过MATLAB中的Serial Port对象,可以进行串口的初始化和数据读写操作。需要注意的是,使用Serial Port对象时要先关闭,防止程序异常中断等问题。 在实际应用中,往往需要通过MATLAB上位机将指令或数据发送给嵌入式系统或其他设备。此时需要将指令或数据进行编码并通过串口发送出去。编码方式有很多种,例如ASCII码、二进制码、十六进制码等,需要根据具体情况进行选择和转换。 对于嵌入式系统或其他设备返回的数据,MATLAB上位机需要通过串口接收并进行解码处理。接收方式一般分为同步接收和异步接收两种。同步接收是通过一定时间间隔重复读取串口缓冲区中的数据,一般用于数据传输量较小的情况。异步接收则是通过事件驱动的方式,当串口缓冲区中有数据可读时触发相应的事件进行数据读取操作。需要根据实际情况选择合适的接收方式,并进行相应的数据解码操作。 综上所述,MATLAB串口通信实现需要了解串口参数配置、数据编码和解码以及同步和异步数据读取等相关技术,可以实现与不同设备的数据传输和控制。
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值