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

Matlab GUI上位机界面实现串口通信MatlabGUI因项目需求,不得不学的又杂又浅,趁着还没彻底忘记,写下来一些关键注意点。命令行窗口输入guide→BlankGUI→确定根据自己的需求,拖动选择对应的工具,如下图所示双击每一个对象,就可以弹出其检查器,修改其属性,字体大小、粗细、位置等,其中最关键的是两个,一是String,二是Tag,String是用来修改对象中的文字,Tag是所调用的代码名,这个要好的…

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

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

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

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

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

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

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

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

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’

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

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

目前演示结果如下:

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

 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上位机界面实现串口通信

Matlab GUI实现简单的很容易,但是在操作过程中会有各种各样的bug,需要慢慢探索研究…… 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146162.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Mybatis拦截器

    Mybatis拦截器一Mybatis拦截器介绍    Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。通过Mybatis拦截器我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。所以Mybatis拦截器的使用范围是…

  • PSRSALSA 教程[通俗易懂]

    PSRSALSA 教程[通俗易懂]psrsalsa的安装与使用

  • 番茄时间计时器_番茄计时器怎么调时间

    番茄时间计时器_番茄计时器怎么调时间今天读书学到个番茄时间,不想下app,写了个html,在手机上打开,横屏,是一样的计时效果。方法很笨,问题很多,勉强能用。因为很简陋,没有调,如果不按顺序按键,可能崩溃。1.先选时间,30分钟

  • python入门教程(非常详细)书_python编程入门基础

    python入门教程(非常详细)书_python编程入门基础【Python第1课】安装…6【Python第2课】print.7【Python第3课】IDE.10【Python第4课】输入…12【Python第5课】变量…14【Python第6课】bool.16【Python第7课】if.19【Python第8课】while.23【Python第9课】random.

    2022年10月12日
  • not apng file怎么解决_function

    not apng file怎么解决_functionpadStartisnotafunction问题描述微信小程序开发时,控制台padStartisnotafunction;解决方案不用这个方法了呗,或者自己重新在String.prototype.padStart中自己实现,毕竟是es6之后的方法,经测试,微信6.6.6版本不支持,6.6.10版本支持,和版本也有一定的关系,期望以后的支持性…

  • Nginx+FastCGI到底是谁影响超时时间[通俗易懂]

    Nginx+FastCGI到底是谁影响超时时间

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号