MATLAB串口操作和GUI编程

时间:2024-03-11 07:00:30

程序说明

V1.0 2015/2/08

MATLAB串口操作和GUI编程

 

概述

 

本文介绍了程序AD9512_Serial_GUI的编程思路和功能。该程序设计到MATLAB的图像用户界面编程的基本方法和串口的基本操作。程序目的在于通过串口写控制字对AD9512进行配置(AD9512通过SPI写入寄存器,本程序只是整个控制程序中的一部分)。

修订历史

以下表格展示了本文档的修订过程

日期

版本号

修订内容

2015/01/15

V0.0

初始版本,试验版[1]

2015/02/06

V1.0

修正问题,通过验证[2]

[1]. 试验版本表明该版本应用笔记及对应代码没有通过实际验证,同时仿真分析也可能没有进行。试验版对应的版本号为V0.X。

[2]. 写入操作时将 \'async\' 去掉,基本通过验证,同时由于RS232写入是LSB的顺序,和FPGA端代码不匹配,因此此处更改了serialwrite程序。

简介

 

本程序基于MATLAB 2014a 编写,本文档中提到的"MATLAB"均指该特定版本MATLAB。

本程序想要实现的功能是:上位机控制AD9512,当然AD9512是和FPGA相连的,而FPGA通过串口和上位机连接。AD9512的控制方法参见其DataSheet,通过SPI配置。从原理上来说,SPIUART都是全双工的,但是读取过程中也需要写入控制头,此处采用的是半双工方式。

本程序的思路在于将FPGA看作是一个UARTSPI的器件,直接通过上位机配置AD9512FPGA端的处理暂时不考虑,本MATLAB程序按照需要写入的控制字生成传输程序。以下是本程序涉及到的相关背景知识。

串行通信和RS232

略。(可参考MATLAB帮助 - Data File Management – Serial Port Devices或相关文献)

MATLAB的串口操作

串口操作和实际上很简单,大部分从MATLAB的帮助中就可以找到。建立,打开,关闭,删除,写数据,读数据。基本操作就是这些。需要注意的是串口打开后切记要记得关闭。基本操作有

s=serial(\'COM1\');

fopen(s);

fwrite(s,100); %写一个字节

fread(s,[1 1],\'unit8\'); %读一个字节

fclose(s);

delete(s);

MATLAB的GUI编程

这一个程序还是比较初级的,对于没有接触过MATLAB GUI编程的人来说,参考MATLAB帮助 – MATLAB -GUI Building - GUI Building Basics - Examples and How To-Create a Simple GUIDE GUI,按照其中的例子自己完成一次,并了解其基本原理后,了解这个程序就十分容易了。

程序设计

 

程序设计流程按以下流程进行:

  1. 明确需求
  2. 设计合理界面
  3. 写回调函数实现基本的界面控制
  4. 写功能函数实现功能

需求

程序功能分简单,具体来说只需要实现3个功能即可。

  • 串口选择和打开、关闭操作;
  • 控制字输入功能;
  • 发送或接收相关信息。

界面设计

综合需求考虑需求,界面设计如下

其中,界面最下方准备在后续版本中添加状态输出窗口,以便及时了解程序的运行状态。本程序采用GUI Guide编写图像用户界面,用到了以下组件

statictext:静态文本

button:按钮

buttongroup:按钮组(将这些按钮联系在一起)

table:表格

edittext:可编辑文本

panel:面板,把一些控件结合起来

编程中一个相对良好的习惯是给每一控件的"Tag"属性命名(有意义),而不应该使用默认名字。

对于MATLAB的GUI编程,个人观点是(暂时)对于复杂的应用不要采用MATLAB,对于简单的应用可以采用,但是真的很不好用。MATLAB的优势在于其强大的数学计算能力,如果应用不需要这一点(譬如说本应用),那么也不应该使用。

界面控制

此处我想表达的意思在于,当触发某一控件操作后,能够及时改变其他控件的相应状态,防止非法操作的进行。譬如,该程序仅对一个串口进行操作,在正确打开串口后,关闭串口前无法再次执行"打开"操作或是改变串口端口号。

完成这一功能及其简单,只需要采用set命令改变控件状态即可,譬如使得"打开"按钮无法使用(呈"灰色")

set(handles.portOpen,\'enable\',\'off\');

这些语句大抵都写在Callback函数中。Callback函数大抵是MATLAB GUI编程中最重要的了,如果没记错的话类似java里面的监听。也就是说对某些操作的响应。不同的控件出发callback的过程是不一样的,具体可以参考帮助或是《MATLAB GUI 设计学习手记》。对于界面的几乎所有元素,都可以通过handles访问。

本版程序对部分操作有相应的处理,然而很不完善。这也说明看似简单的东西也需要仔细思索,做起来往往不是那么容易。

功能实现

本程序中有三个函数,包括

  • serialOpen.m 串口打开操作
  • serialWrite.m 写操作
  • serialRead.m 读操作

将其写出函数而不保留在主程序内的优点暂时看来有两点:其一是主程序过长而且大部分内容是MATLAB自动生成的;其二是对应不同的应用需要修改参数或是输出格式时,只需相应修改这几个函数即可。

串口打开操作较为简单,通过获取可编辑文本框内的端口号打开即可。读写操作类似,以下以写操作为例做简要介绍。

写数据之前需要获取要写的数据,即用户输入表格中的数据。表格在MATLAB中叫做Uitable,里面存放的数据类型是cell array(元胞数组)。(cell是MATLAB的一种数据类型)必须要注意的是,在建立Uitable的时候设置个列的数据类型后,即使不使用set方法改变其类型,Uitable的数据类型也可能会因为你设置的cell的类型的变化而变化。(在建立Uitable的时候,也有相关的警告)

通过使用get方法可以得到表格内的全部数据data,通过data{m,n}可以访问相应位置的内容( data(m,n)访问的是元胞)。本程序中输入格式是字符串,对应应该是两位的16进制字符(程序暂时没有任何的查错能力,任何非法输出会导致程序停止运行)。

serialWrite中的操作就是简单的将16进制的字符串转换为数字,之后通过fwrite函数发送出去。相应的针对AD9512,有每次写入1byte的话,头部应该是0+addr,之后跟寄存器。将cell array中的字符串转换后发送即可,记得最后需要写5A寄存器完成更新的过程。在读取情况下,头部写8+addr就可以等待接收数据了。

参考

 

MATLAB帮助

MATLAB GUI 设计学习手记

MATLAB编程(第二版)- 菜鸟入门教材

代码

 

代码详见AD9512_Serial_GUI