MATLAB APP 设计实践(一)UART通信(下篇)

news2024/12/22 18:50:43

引言

上篇介绍了 MATLAB App 的基本内容,本篇就结合UART发送数据的具体案例介绍开发过程。文末给出设计源文件、设计的可执行文件的下载链接,以及App的实际使用视频(与FPGA开发板进行调试验证)。

前文链接:

MATLAB APP 设计实践(一)UART通信(上篇)

在看本篇文章之前,最好看一下上篇文章,做好前期准备工作。

MATLAB 版本:R2022a


最终界面展示

在开始讲解之前,先展示一下,最终的应用界面:

设计APP之前要想清楚的几个问题

APP页面总体布局

在设计之前要考虑清楚,设计的App要用到哪些组件,这些组件如何放置,如何布局,尽可能做到简洁美观。

App覆盖什么功能

要考虑清楚App的功能需求以及用什么方法来满足这种需求。

App有哪些内部共享数据

这个问题是更深层次的考虑,根据功能需求分析该App内需要有哪些共享数据在不同的函数之间传递。

App需要哪些回调

这个回调函数可以近似理解为中断处理程序,每当相应的事件发生,就会调用该函数一次。如按键每按下一次就产生一次亮灯;每选择一次下拉菜单就更新某个数据等。

App需要哪些内部处理函数

如做一个信号处理或者数字图像处理的App,就需要考虑设计一个函数来实现信号处理或者图像处理算法。

UART通信App设计

功能需求(发送图片像素RGB数据)

界面需求:
1、可以选择要发送的图片并显示图片内容;
2、可以设置UART发送的波特率:9600bps、57600bps、115200bps;
3、可以选择COM口;
4、可以设置数据发送间隔(单位:秒);
5、具有发送开关;
6、实时显示当前发送的数据所在的行列索引号;
7、图片导入时显示显示图片规格,格式为 :长度 X 高度;
8、图片发送时首先发送16位帧头:0x5A4B;
9、可以读取设备写回的帧头并显示在界面;
10、数据发送时按像素数据的R、G、B分量依次发送;
11、界面显示一个指示灯,指示发送状态:
灰色:待机/停止发送
绿色:正在发送
蓝色:发送完成
12、只发送真彩图,如果发现图片是灰度图,则需要弹出错误警示。

设计思路

界面规划

由于此App的功能需求不是很复杂,所以整体的规划是用一栏的界面完成。

组件需求

  1. 开关组件,实现发送/暂停的控制;

  1. 指示灯组件,显示发送状态;

  1. 按键组件,点击时选择将要发送的图片;

  1. 文本/数值显示组件,显示帧头信息、图片规格信息、像素数据索引号信息以及接收发送间隔等;

  1. 图片组件,显示博客昵称;

  1. 超链接组件,点击后跳转至本人博客主页;

  1. 下拉栏组件,供选择波特率以及COM口;

App内部共享数据

通过下面的方式添加App的属性,以在App内共享数据:

我所添加的属性:

    properties (Access = private)
        IMAGE_DATA   % 图像数据
        IMAGE_DATA_R % 图形数据行数
        IMAGE_DATA_C % 图像数据列数
        COM_NAME     % 串口号名称
        BAUD_RATE    % 通信波特率 bps
    end

App启动设置

此App在启动时,我想让其自动加载一些默认配置,比如波特率,指示灯颜色,端口号等。

创建startupFcn回调的方法:

在此回调内,配置加载默认信息:

我的回调:

% Code that executes after component creation
        function startupFcn(app)
            % Configure image axes
            app.ImageAxes.Visible = 'off';
%             app.ImageAxes.Colormap = gray(256);
            axis(app.ImageAxes, 'image');

            app.Lamp.Color = [0.65 0.65 0.65];

            app.EditField.Value = 0;
            app.EditField_2.Value = 0;
            app.EditField_3.Value = '';
            app.EditField_4.Value = 0;
            app.XEditField.Value = 0;
            app.bpsDropDown.Value = '115200';
            app.COMDropDown.Value = 'COM5';
            app.bpsDropDownValueChanged;
            app.COMDropDownValueChanged;
        end

设计过程

图片选择

此功能的实现过程如下:

1、用户点击按钮后;
2、APP 弹出文件管理器;
3、用户选择将要发送的图片;
4、APP 获取图片的路径字符串;
5、APP 使用 imread 函数读取图片数据,获取其图片尺寸规格,并在图片显示区域显示图片内容;
6、APP 判别图片是否为真彩图,即是否同时具有 R G B 3种分量;
7、如果是真彩图,则准备发送,否则弹窗报错;

此处的图片选择借鉴官方例程:

创建使用多个坐标区来显示图像分析结果的 App

可以在MATLAB命令行输入如下命令打开例程:

openExample('matlab/AppdImageHistogramsExample')

此处需要添加一个按钮的回调,当用户按下此按钮时,需要将文件管理器弹开,让用户选择将要发送的图片。

点击按钮,右键,添加回调。

另外,案件的其他设置可以在右侧的侧边栏完成设置:

我的回调函数:

        % Button pushed function: Button
        function ButtonPushed(app, event)
            % Display uigetfile dialog
            filterspec = {'*.jpg;*.png;*.gif','All Image Files'};
            [f, p] = uigetfile(filterspec);
            
            % Make sure user didn't cancel uigetfile dialog
            if (ischar(p))
               fname = [p f];
               app.Lamp.Color = [0.65 0.65 0.65];
               app.EditField.Value = 0;
               app.EditField_2.Value = 0;
               app.EditField_3.Value = '';
               DATA = imread(fname);
               app.EditField_4.Value = (size(DATA,2));
               app.XEditField.Value = (size(DATA,1));
               FUNC_DISP_IMAGE(app,fname);
            end
        end

图片显示

此功能通过函数实现,添加App内部私有函数:

函数内容:

  % 图片显示函数
        function FUNC_DISP_IMAGE(app,IMAGE_NAME)
            try
                app.IMAGE_DATA = imread(IMAGE_NAME);
                app.IMAGE_DATA_R = size(app.IMAGE_DATA,1);
                app.IMAGE_DATA_C = size(app.IMAGE_DATA,2);
            catch ME
                % If problem reading image, display error message
                uialert(app.UIFigure, ME.message, '图片读取失败!');
                return;
            end
            if(size(app.IMAGE_DATA,3)==3)
                imagesc(app.ImageAxes,app.IMAGE_DATA);
            else
                msgbox('输入图像不是真彩图,请重新选择图片!','运行错误提示','error');
                return;
            end
        end

UART发送像素数据

同样的方式,添加私有函数,通过函数发送:

        % UART 发送像素数据
        function FUNC_UART_SEND_RGB_DATA(app)
            
            if(strcmp(app.Switch.Value,'On'))
                % 创建串口连接
                SERIAL_OBJ = serialport(app.COM_NAME,app.BAUD_RATE);
                SERIAL_OBJ.Parity = "none";
                SERIAL_OBJ.DataBits = 8;
                SERIAL_OBJ.StopBits = 1;
                SERIAL_OBJ.ByteOrder = "little-endian";
                SERIAL_OBJ.Timeout = 30;
                % 清除缓存
                flush(SERIAL_OBJ);
                % 指示灯变绿
                app.Lamp.Color = [0 1 0];
                % 发送帧头
                write(SERIAL_OBJ,hex2dec('5A'),'uint8');
                write(SERIAL_OBJ,hex2dec('4B'),'uint8');
                READ_DATA = read(SERIAL_OBJ,2,'uint8');
                app.EditField_3.Value = reshape(dec2hex(READ_DATA).',1,[]);
                pause(2);
                % 数据发送
                for i = 1:app.IMAGE_DATA_R
                    app.EditField.Value = i;
                    app.EditField_2.Value = 0;
                    for j = 1:app.IMAGE_DATA_C
                        if(strcmp(app.Switch.Value,'On'))
                            app.EditField_2.Value = j;
                            write(SERIAL_OBJ,app.IMAGE_DATA(i,j,1),'uint8');
                            write(SERIAL_OBJ,app.IMAGE_DATA(i,j,2),'uint8');
                            write(SERIAL_OBJ,app.IMAGE_DATA(i,j,3),'uint8');
                            pause(app.sEditField.Value)
                        else
                            app.Lamp.Color = [0.65 0.65 0.65];
                            flush(SERIAL_OBJ);
                            delete(SERIAL_OBJ);
                            return;
                        end
                    end
                end
                % 清除缓存
                flush(SERIAL_OBJ);
                % 关闭串口
                delete(SERIAL_OBJ);
                % 指示灯变蓝
                app.Lamp.Color = [0 0 1];
                app.Switch.Value = 'Off';
            else
                app.Lamp.Color = [0.65 0.65 0.65];
                return;
            end
        end

编程说明

App Designer 类似于C++ 的面向对象编程,数据的索引需要用 app.对象名 的形式;例如访问/取用APP内的私有数据需要用app.变量名 的形式。知道了这一点 App的开发就很简单了。

App设计源码分享

此App的设计源文件(.mlapp)以及可执行文件(.exe)放在这里,如果需要可以下载:

提取码:XYB1

App演示视频

UART发送像素数据——MATLAB APP设计 演示视频


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 分区(innode引擎的讲解)

目录 一.InnoDB逻辑存储结构 段 区 页 二.分区概述 分区 三.分区类型 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。 段 段就是…

【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

文章目录基本原理绘图层次定义距离基本原理 和Birch聚类相似,层次聚类也是一种依赖树结构实现的聚类方法,其核心概念是相似度。根据相似度,可以将所有样本组织起来,从而构建一棵层次聚类树。 其中Birch算法的核心,叫…

MyBatis【多表查询与动态SQL使用】

MyBatis【多表查询与动态SQL使用】🍎一.MyBatis多表查询🍒1.1 一对一查询🍒1.2 一对多查询🍎二.动态SQL使用🍒2.1 if 标签使用🍒2.2 trim 标签使用🍒2.3 where 标签使用🍒2.4 set 标…

ARX测试_绘制道路横断面

本文迁移自本人网易博客,写于2011年1月12日,ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)1、已提供道路的图形,获取用户输入的两点,并在两点间画一条虚线。计算这条直线与多少条直线相交,若数量不等于…

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58( 0x33~0x3A) 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时,寄存器 51 内为频率值,寄存器 55 内为温度值 4 通道模块时,寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先,是PMP考试的核心教材:《PMBOK指南》,目前已经出道第七版了,大家如果有备考的需要要赶紧买一本来学习。 其次,是《汪博士解读PMP》,目前出到第6版,这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄指南目录📖:🎉🎉机械臂速成小指南(零点五):机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况,当监测到皮带出现撕裂跑偏时,立刻抓拍告警并中止皮带的运输。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面,最好、最容易上手的动态博客系统之一( solo 也是),轻快,简洁,功能强大。 正文 上周末正在募集团队一起写算法题,群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…

MFC高级控件RichEdit2.0的使用

MFC高级控件RichEdit的使用MFC高级控件RichEdit的使用MFC控件设置焦点&#xff0c;实现回车后编辑框内容清空&#xff0c;焦点停留在该编辑框内MFC高级控件RichEdit的使用 RichEdit控件&#xff0c;可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。 效果如下&#xf…

Python--文件基本操作

文件的存储方式 在计算机中&#xff0c;文件是以 二进制的方式保存在磁盘上的 文本文件和二进制文件 文本文件 可以使用文本编辑软件查看本质上还是二进制文件二进制文件 保存的内容 不是给人直接阅读的&#xff0c;而是提供给其它软件使用的二进制文件不能使用 文件编辑软件…

NTN(一) 基本架构

R17将NTN纳入了3GPP规范&#xff0c;NTN是 non-terrestrial networks非地面网络缩写&#xff0c;通过卫星或无人机平台实现NR通信&#xff0c;在地面网络设备无法普及的地方&#xff0c;采用NTN覆盖&#xff0c;进一步提升覆盖范围。例如在沙漠、海洋等极限区域&#xff0c;采用…

TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP-数据格式 数据偏移 占4位&#xff0c;取值范围是0x0101~0x1111乘以4就是首部长度&#xff08;Header Length&#xff09; 保留 占6位&#xff0c;目前全为0 有些资料中&#xff0c…

虚幻C++ 关于怎么打印日志

虚幻C 关于怎么打印日志 先打开日志窗口认识一下! 这个就是日志窗口了&#xff01; 可以对信息进行过滤&#xff01; 也可以只显示某种日志&#xff01; 认识完界面了&#xff01;开始写代码啦&#xff01; 老规矩&#xff0c;先给一个入口函数&#xff01; #include &qu…

社交电商红利期,怎么抓住这一波自带流量

自拼多多依靠社交电商模式跃升为行业前三时&#xff0c;社交电商模式就被众多学者以及电商人士研究&#xff0c;过去一年&#xff0c;亚马逊、Starday、TikTok等跨境电商服务平台纷纷推出“直播”功能&#xff0c;试图跟上社交电商发展红利期&#xff0c;为平台抓取更多流量。而…

原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧

我们要做的效果是如下&#xff0c;就像这个app一样底部的每个菜单点击是有动画的&#xff1a; 此问题来源于我们的一位ui设计师他无法制作Lottie动画无法输出.json格式给到我们的安卓工程师&#xff0c;因此还有一种方法就是做个gif图&#xff0c;而这个目前他也不会只有给大家…

Mysql 索引 以及 SQL 优化 (自用笔记)

(笔记来源 https://www.bilibili.com/video/BV1Kr4y1i7ru?p88&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 3.索引 3.1索引的语法 3.1索引的性能分析 3.1.1查看SQL执行频率 增删改为主的SQL的一般不需要优化 查询居多的SQL则需要优化 3.1.2慢查询的日志 记录了超过…

蓝牙透传模块芯片的BLE和SPP有什么区别?如何理解

一、什么是蓝牙透传芯片 蓝牙透传芯片的BLE和SPP有什么区别&#xff1f;如何理解呢&#xff1f; 首先要明确几个关键词&#xff0c;蓝牙芯片&#xff0c;蓝牙透传&#xff0c;蓝牙BLE&#xff0c;以及蓝牙SPP 第一&#xff1a;蓝牙芯片的概念可以参见一下网上的说明&#xff…

内网渗透测试——内网渗透测试基础

1.内网基础知识 1.工作组 再局域网中将不同的计算机按照功能&#xff08;或部门&#xff09;分别列入不同的工作组。 加入创建工作组&#xff1a;点击桌面上的计算机图标&#xff0c;再弹出的快捷键菜单中选择属性&#xff0c;然后几次点击更改设置和更改按钮。再计算机名输…