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)


相关推荐

  • C#桌面文案小工具 ,详细带解说图(带源码)

    C#桌面文案小工具 ,详细带解说图(带源码)新手!新手!新手!有什么不对的地方可以交流交流最近无聊,写了一个小工具,每隔一段时间随机刷新一下文案,并且还可以连接数据库思路:1窗体的隐藏:在属性上面把BackCoor和TransprencyKey设置成一样的就可以隐藏窗口了2日期时间的刷新:在窗体上创建一个label标签,这个没什么好说,直接获取时间然后创建一个计时器一直刷新他,频率设置成1—900都可以,代码记得写在计时器label2.Text=DateTime.Now.ToString();//20

  • PyCharm激活码永久有效PyCharm2021.2.3激活码教程-持续更新,一步到位「建议收藏」

    PyCharm激活码永久有效PyCharm2021.2.3激活码教程-持续更新,一步到位「建议收藏」PyCharm激活码永久有效2021.2.3激活码教程-Windows版永久激活-持续更新,Idea激活码2021.2.3成功激活

  • consolewriteline用法_对象生气了怎么哄

    consolewriteline用法_对象生气了怎么哄1.Promise的含义Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了P

  • Python几种主流框架

    Python几种主流框架从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。Django:PythonWeb应用开发框架Django应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据…

  • EditPlus工具添加XML格式化插件[通俗易懂]

    EditPlus工具添加XML格式化插件[通俗易懂]   使用EditPlus打开XML文档,发现文件内容没有格式化,非常难看,使用IE浏览器打开这些XML文档是格式化的,但是IE浏览器却不能编辑。   在网上找了一些资料发现能够通过一个小插件“xmlstarlet”来实现EditPlus格式化XML文档。具体步骤如下:   1. 在http://xmlstar.sourceforge.net/down…

  • printwriter用法_stylewriter使用教程

    printwriter用法_stylewriter使用教程OutPutStream可以被封装成PrintWriter,OutputStream比较底层一些,是以字节为单位传输的,而PrintWriter是以字符为单位输出,所以就会涉及到转码编码的问题,如果用PrintWriter发送char[]和byte[],在服务端收到的常常是有一些字符会失真.PrintWriter以字符为单位,支持汉字,OutPutStream则不行总结:处理

发表回复

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

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