Matlab上位机开发 | 您所在的位置:网站首页 › 上位机界面都用什么软件开发 › Matlab上位机开发 |
Matlab上位机开发
1 了解上位机1.1 上位机的作用1.2 常用上位机开发方式1.2.1 Windows上位机(基于串口通信)1.2.2 Android上位机(基于网络通信)
1.3 教程概况1.3.1 C#上位机开发教程1.3.2 IoT App开发1.3.3 Matlab上位机开发
2 Hello,World2.1 启动GUIDE2.2 拖动控件,开始设计2.2.1 控件栏2.2.2 静态文本显示控件2.2.3 按钮控件
2.3 回调函数,让界面动起来2.4 大功告成,试试效果
3 波形显示(幅度和频率可调节)3.1 控件布局3.1.1 波形显示控件(axes)3.1.2 滑动条控件(slider)3.1.3 可编辑文本框(edit)3.1.4 按钮控件3.1.5 保存设计
3.2 回调函数,让界面动起来3.2.1 滑动条和编辑框联动3.2.2 编写一个绘制波形的自定义函数3.2.3 点击按钮,显示波形3.2.4 添加频率滑动条调节波形功能3.2.5 添加幅度滑动条调节波形功能3.2.6 添加编辑框调节频率和幅度的功能3.3 演示效果
4 Matlab获取自带摄像头或者USB摄像头数据4.1 两种获取摄像头的方式4.2 使用Image Acquisition Toolbox4.2.1 安装硬件支持包4.2.2 玩转摄像头
4.3 使用USB Webcams包4.3.1 安装硬件支持包4.3.2 玩转摄像头
4.4 在GUI中显示视频流并拍照4.4.1 拖动控件,设计界面4.4.2 实时显示摄像头画面4.4.3 关闭摄像头实时显示4.4.4. 拍照(抓取画面)
5 Matlab串口通信5.1 Matlab串口通信5.1.1 创建串口对象5.1.2 打开串口5.1.3 写入数据5.1.4 读取数据5.1.5 关闭串口
5.2 串口中断5.2.1 触发中断的条件5.2.2 串口中断处理回调函数
转载自:mculover666微信公众号
向前辈学习!
1 了解上位机
1.1 上位机的作用
在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形、温度等)用户控制(LED,继电器等)文件传输(图像、音频等)下位机(单片机)与 上位机之间进行数据通信有四种主要方式: 串口 主要适用于下位机和上位机在一起的系统,使用USB转串口与PC相连,也可以使用无线透传串口模组,将串口信号转化为射频信号传输;USB 速度相较于串口大幅提升,适合于工控设备传输文件(比如3D打印机、激光切割机等),但是对下位机要求较高,需要支持USB协议;网络 一方面适用于物联网项目,一方面适用于嵌入式Linux系统(已经移植支持了网络);蓝牙 不多用。 1.2 常用上位机开发方式上位机软软件开发主要包括以下两种: 1.2.1 Windows上位机(基于串口通信) WinForm或者WPF(C#) 在Windows上,最早用VB语言开发,后来由于C++的发展,采用MFC开发,再后来微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高;c#和Java的语法类似,WPF相较于WinFormden优势在于,可以使用xml语言编写更加炫酷的界面; Qt(C++) 一方面可以跨平台运行,另一方面,对于嵌入式Linux中已经熟练掌握Qt开发的开发者,使用Qt再来开发上位机非常方便; Labview 有着更加丰富好看的数据显示控件和逼真的交互控件,并且可以图形化开发; Matlab 多适合于需要上位机进行信号处理的项目,比如本身掌握Matlab中基本信号处理的科研人员,只需要使用下位机(Arduino)来读取ADC的数据并发送到PC进行处理,还可以进行图像处理,语音信号处理等; 1.2.2 Android上位机(基于网络通信)使用Java或者kotlin编写(APP) 利用Android Studio开发,多适用于物联网项目的数据显示和控制; 使用XML+CSS+JavaScript编写(小程序) 微信提供了开发工具,多适用于物联网项目的数据显示和控制,相对APP比较轻量级,并且开发方式和网页开发类似。 1.3 教程概况目前作者已经出的教程有: 1.3.1 C#上位机开发教程
这个系列教程由作者和B站up主“阿正啷个哩个啷”联合出品,有文字教程和视频教程,非常简单粗暴,没有Java基础也能开发: 文字教程: bilibili视频教程: 从本篇文章开发,我将带领大家一起掌握如何通过 Matlab 开发上位机,目前计划的有以下这些,敬请期待: Matlab上位机开发(二)Hello,WorldMatlab上位机开发(三)波形显示(幅度和频率可调节)Matlab上位机开发(四)Matlab调用自带摄像头或者USB摄像头并显示Matlab上位机开发(五)Mtalab串口通信 希望本系列教程可以给你带来帮助~注:Matlab2018可以在作者提供的不限速下载站下载,点击阅读原文即可跳转。 2 Hello,World 2.1 启动GUIDE在Matlab命令行输入guide启动Matlab的图形界面设计工具,选择创建一个空白的GUI: 控件栏中提供了13个控件,分别为: 按钮滑动条单选按钮复选按钮可编辑文本静态文本弹出式菜单列表框切换按钮表坐标轴面板按钮组 2.2.2 静态文本显示控件首先从左边控件栏拖动到设计画布中: ① 控件风格和外观 CData:在控件上显示的图像; ② 控件回调函数的执行控制 BusyAction:处理回调函数的中断,有两种选项:即Cancel:取消中断事件,queue:排队(默认设置); Interruptible:指定当前的回调函数在执行时是否允许中断,去执行其他的函数; ③ 控件对象创建和删除控制 CreateFcn:在对象产生过程中执行的回调函数; DeleteFcn:删除对象过程中执行的回调函数; ④ 控件标识信息 Tag:控件的标识信息,可以自定义; 2.2.3 按钮控件同样,拖动一个按钮控件到画布中,并修改其属性: Matlab中控件(比如按钮),和用户交互的机制是设置回调函数,什么是回调函数呢? 当用户在点击按钮之后,程序中需要调用来处理该按钮点击事件的函数,称为该按钮的回调函数! 设置一个控件的回调函数非常简单,只需要右击该按钮即可查看其所有的回调函数: 第一个参数根据传入的对象句柄和控件的唯一标识来寻找控件,第二个参数为要改哪个属性,第三个参数为改变的属性值,举一反三,其它的操作也是一样。 2.4 大功告成,试试效果点击运行或者按F5,程序启动后如图: 打开Matlab,在命令行输入guide启动GUI设计工具,拖动控件开始设计: 3.1.1 波形显示控件(axes)波形显示控件可以用于绘制各种波形,拖动控件到画布中即可,然后根据需要调整控件大小: 滑动条可以用于滑动调节波形的频率和幅度,并拖动两个静态文件控件用于说明: 可编辑文本框有两个功能: 用于直接设置波形的频率和幅度;用于显示滑动条设置的频率值和幅度值;拖动两个编辑框并在属性中设置其默认值: 按钮控件用于启动波形显示: 设计完成之后,点击保存按钮或者按Ctrl+S保存设计: 首先编辑滑动条的回调函数,实现拖动滑动条,编辑框可以显示对应的值: v1 = get(handles.slider1, 'Value'); s1 = sprintf("%f", v1); set(handles.edit1, 'String', s1);
同样,编写另一个滑动条的回调函数: v2 = get(handles.slider2,'Value'); s2 = sprintf("%f", v2); set(handles.edit2, 'String', s2);实现的效果如下: 同样,再来编写幅度文本框的回调函数: s2=get(handles.edit2,'String'); v2=str2double(s2); set(handles.slider2,'Value',v2); 3.2.2 编写一个绘制波形的自定义函数点击按钮、调节滑动条,都需要重新绘制波形,所以先编写一个自定义函数,供其它函数调用: function draw_wave(handles) global Fs global A Fs = 44100; dt=1.0/Fs; T =2; N=T/dt; t=linspace(0,T,N); s1=get(handles.edit1,'String'); F=str2double(s1); s1=get(handles.edit2,'String'); A=str2double(s1); x =A*sin(2*pi*F*t); plot(handles.axes1,t,x,'b','LineWidth',1.5); axis(handles.axes1,[0, 0.01, -2500,2500]); grid(handles.axes1); 3.2.3 点击按钮,显示波形编写按钮的回调函数,在回调函数里调用之前编写的自定义函数显示波形: draw_wave(handles);运行效果如下: 继续编辑滑动条的回调函数,添加波形显示功能: 频率调节滑动条完整的回调函数如下: v1 = get(handles.slider1, 'Value'); s1 = sprintf("%f", v1); set(handles.edit1, 'String', s1); global Fs Fs = v1; draw_wave(handles);运行效果如下: 继续编辑滑动条的回调函数,添加波形显示功能: 幅度调节滑动条完整的回调函数如下: v2 = get(handles.slider2,'Value'); s2 = sprintf("%f", v2); set(handles.edit2, 'String', s2); global A A = v2; draw_wave(handles);运行效果如下: 同样,在频率编辑框的回调函数中添加代码,完整的回调函数如下: s1=get(handles.edit1,'String'); v1=str2double(s1); set(handles.slider1,'Value',v1); global Fs Fs = v1; draw_wave(handles);在幅度编辑框的回调函数添加同样的功能,完整的回调函数如下: s2=get(handles.edit2,'String'); v2=str2double(s2); set(handles.slider2,'Value',v2); global A A = v2; draw_wave(handles);运行即可看到效果,请参考下一节的完整演示效果。 3.3 演示效果整个程序的完整演示效果如下: Matlab自身不支持直接读取摄像头数据,需要安装硬件支持包才可以获取,目前常用的有两个包: 第二个是Image Acquisition Toolbox Support Package for OS Generic Video Interface,更加通用,它也兼容 R2014a 到 R2020a 的版本。(推荐) 4.2 使用Image Acquisition Toolbox 4.2.1 安装硬件支持包首先执行这条命令打开摄像头,测试是否可以调用videoinput函数: video_source = videoinput('winvideo',1)如果出现图中的错误,那么恭喜你,需要手动安装硬件支持包了。 ① 查看电脑上已经安装的图像适配器 Matlab的图像获取工具箱(第一步安装的硬件支持包)中提供了函数,可以获取查询当前PC上已经连接的摄像头信息,函数如下: imaqhwinfo()
当前我的电脑上一共有两个摄像头,一个是笔记本电脑内置的摄像头,另一个是我连接的USB 2.0 摄像头,接下来以USB摄像头为例,说明如何查看摄像头的设备ID和具体信息: 在工作区找到保存信息的变量win_info,双击查看其值:
使用如下的命令来创建一个视频输入对象: video_obj = videoinput(adaptorname,deviceID,format)该函数的三个参数说明如下: adaptorname:适配器名称(必须)deviceID:设备ID号(必须)format:视频采集格式(不填写则使用默认) 如下,我要创建USB摄像头的视频输入对象: video_obj = videoinput('winvideo',2)
点击获取附加功能中的获取硬件支持包: ① 查看当前摄像头设备列表 webcamlist
② 获取视频对象 一行代码即可获取,非常舒服,比如获取外接USB摄像头的输入对象: cam1 = webcam(1)
⑤ 用完之后清除对象 clear 4.4 在GUI中显示视频流并拍照在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。 4.4.1 拖动控件,设计界面在命令行输入guide启动设计界面,新建一个设计文件。 设计的界面如下: 点击开启按钮后,在第一个坐标区实时显示摄像头画面,回调函数代码如下: 首先创建一个全局的视频输入对象: global video_obj; video_obj = videoinput('winvideo', 2, 'YUY2_640x480');然后设置图像格式为RGB: set(video_obj,'ReturnedColorSpace','rgb');获取视频输入对象的信息,用于在坐标区显示: videoRes = get(video_obj, 'VideoResolution'); nBands = get(video_obj, 'NumberOfBands');转换,将视频输入对象与坐标区控件关联起来: hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1);开始显示: preview(video_obj,hImage); start(video_obj);完整的代码如下: global video_obj; video_obj = videoinput('winvideo', 2, 'YUY2_640x480'); set(video_obj,'ReturnedColorSpace','rgb'); videoRes = get(video_obj, 'VideoResolution'); nBands = get(video_obj, 'NumberOfBands'); hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1); preview(video_obj,hImage); start(video_obj);接下来启动后,点击开启按钮,就可以在第一个坐标区看到摄像头实时画面了。 4.4.3 关闭摄像头实时显示点击关闭按钮后,关闭在第一个坐标区实时显示的摄像头画面,回调函数代码如下: global video_obj; stop(video_obj); closepreview(video_obj); delete(video_obj);接下来启动后,点击关闭按钮,就可以关闭在第一个坐标区看到摄像头实时画面了。 4.4.4. 拍照(抓取画面)点击拍照按钮,即可抓取当前视频流的画面,显示在第二个坐标区控件,回调函数代码如下: global video_obj mypic = getsnapshot(video_obj); axes(handles.axes2); imshow(mypic);如果需要对抓取的图片进行处理,则将图片变量mypic设为全局变量! 启动后即可看到效果。 5 Matlab串口通信 5.1 Matlab串口通信Matlab提供了串口通信的功能,串口通信的流程如下: 5.1.1 创建串口对象创建一个串口对象的API如下: scom = serial('');串口号为COM8的形式,这个API有个缺点:不能自动检测目前电脑中存在中的串口。 创建之后设置该串口对象的属性: InputBufferSize:输入缓冲区大小(单位字节)OutputBufferSize:输出缓冲区大小(单位字节)ReadAsyncMode:数据读取模式BaudRate:波特率Parity:校验位StopBits:停止位DataBits :数据位Terminator:触发中断的字符(一般是换行符)FlowControl:流控timeout:一次操作超时时间BytesAvailableFcnMode:设置数据读入格式BytesAvailableFcnCount:触发中断的数据数量BytesAvailableFcn:串口接收中断回调函数 常用设置如下: scom.InputBufferSize = 512; scom.OutputBufferSize = 512; scom.ReadAsyncMode = 'continuous'; scom.BaudRate = 115200; scom.Parity = 'none'; scom.StopBits = 1; scom.DataBits = 8; scom.Terminator = 'CR'; scom.FlowControl = 'none'; scom.timeout = 1; scom.BytesAvailableFcnMode = 'byte'; scom.BytesAvailableFcnCount = 1024; scom.BytesAvailableFcn = @callback; 5.1.2 打开串口打开串口的API为: fopen(scom);打开串口可能会发生异常,所以此函数建议放在try..catch..end中执行: try fopen(scom); catch end 5.1.3 写入数据向串口写入数据的API有两个: fwrite(scom,A); % 以二进制形式向串口对象写入数据A fprintf(scom,str); %以字符(ASCII码)形式向串口写数据str(字符或字符串)如果BytesAvailableFcnMode设置的为byte,则使用 fwrite 。 5.1.4 读取数据从串口读取数据的API也有两个: A = fread(scom,size); %从串口对象中读取size字节长短的二进制数据,以数组形式存于A str = fscanf(scom); %从串口对象中读取字符或字符串(ASCII码)形式数据,以字符数组形式存于str如果BytesAvailableFcnMode设置的为byte,则使用 fread。 5.1.5 关闭串口在不使用串口或者关闭界面之前,必须要关闭串口,否则下次将无法打开该串口: close(scom) 5.2 串口中断上面讲述了使用fread手动读取数据的方式,但是实际应用中,需要使用串口中断自动接收并处理数据。 5.2.1 触发中断的条件触发串口Bytes available事件有两种条件: 当接收到的字符数达到指定的数目时(BytesAvailableFcnCount 属性);当接收到指定字符时(Terminator 属性); 5.2.2 串口中断处理回调函数在上一节设置属性的最后有这样一行代码: scom.BytesAvailableFcn = @callback;这行代码就是设置串口中断处理回调函数,如果是纯m文件可以这样设置,但是在GUI界面中还要传入handles调用控件,如下: scom.BytesAvailableFcn = {@calllback,handles};这里我设置的函数名为callbcak,回调函数自己实现即可: function callback(s,event,handles) |
CopyRight 2018-2019 实验室设备网 版权所有 |