基于MATLAB GUI界面的MCU串口实时绘图设计

本文主要介绍如何利用MATLAB中的GUI工具来制作串口通信上位机,然后利用单片机读取陀螺仪MPU6050的

数据传送到上位机,利用上位机将数据利用绘图实时显示出来,有一部分是参考网上其它教程,

将在结尾给出参考网址。

一、总体设计原理

PC机有USB接口,可以实现串口通信,通过USB转串口数据线连接单片机,用三根线(收、发、地)来实现数

据的发送,用PL-2303HX作为单片机与PC机间的驱动芯片。串口通信总体设计原理图如图1所示。


图1


二、MATLAB的GUI串口通信设计

GUIDE是一个专用于GUI程序设计的向导设计器。而GUI是由各种图形对象,如图形窗口、图轴、菜单、按钮、

文本框等构建的用户界面,是人机交互的有效工具和方法,通过GUIDE可以很方便地设计出各种符合要求的

图形用户界面。用户可以根据界面提示完成整个工程,却不必去了解工程内部是如何工作的。GUI设计既

可以以基本的MATLAB程序设计为主,也可以以鼠标为主利用GUIDE工具进行设计,

也可综合以上两种方法进行设计。

2.1  GUI界面的整体布局设计

利用MATLAB的GUI界面设计程序界面和功能,利用MATLAB R2014a来实现设计,打开MATLAB后:

1、在命令行窗口输入”guide”调出GUIDE工具,如图2

图2

2、直接选择默认方式,勾选“将新图形另存为”,选择自己要存的位置,然后点击OK。出现如下图3所示:

图3


3、MALTAB的GUI主要由两个文件,当设置好GUIDE时点击保存,这时将在当前路径自动产生两个名字相同的文件,但扩展标识符不同,一个为.fig文件,一个为.m文件,.fig主要是GUI图形文件,和GUIDE设计的图像相同,.m文件为程序文件,所有事件响应和计算功能都在这里实现。

在图4中,可以在左侧的控件栏拖曳控件到右侧网格中,如图4

图4

4、控件设置,右击控件点“Property Inspector”或双击控件,如图5

图5


一般仅设置Tag选项和String选项。其中String选项在按钮控件中就是GUI显示时的字符。Tag属性较为重要,在GUI编程时控件的索引主要利用Tag选项的属性并且在GUI生成回调函数时候也是由Tag属性的值命名的。这里将“打开串口”按钮控件的String设置为“打开串口”,tag设置为pbOpenSerial。

5、其他设置可重复以上步骤来放置和设置各个控件,都所有控件设置好之后,要保存一下,然后点击右侧的“.m”文件可以看到相对应的控件的程序设计区。

MATLAB的按钮以及各种控件事件响应是依靠一种叫做回调函数(Callback Function)来实现的,自动生成的M文件中已经自动做好回调函数的名称和参数了,我们需要做的就是在其中添加你要进行的处理。

例如:我们要在鼠标单击按钮“打开串口”时进行一系列的串口初始化动作,这时右键单击“打开串口按钮”如图6,7

图6

图7


按钮的Tag为pbOpenSerial,所以GUIDE自动生成的回调函数名为pbOpenSerial_Callback,函数有3个参数

·hObject是当前控件对象,即打开串口按钮对象(面向对象技术中的概念),索引或设置当前对象(打开串口按钮对象)时只需要引用hObject就可以了。例如:改变当前空间的可见性,只需调用set(hObject,'Visable','off');打开串口对象在单击该按钮时即会隐藏。

·eventdata我暂时没有用到,所以暂且不管他

·handles我理解是整个GUI界面的索引句柄,所有GUI界面上的控件都可以通过他来索引,几乎有全局作用域,例如在打开串口按钮的回调中要将关闭串口按钮显示出来,可以这样调用:

set(handles. pbOpenSerial,'Visable','on');就可以了!

这里handles还有一个作用就是在不同控件间进行参数传递,只要对handle的成员变量进行赋值就可以了。当然后面要调用一下guidata(hObject,handles);将变量保存。

例如打开串口按钮里面有个数据10需要关闭串口按钮调用可以这样写。

        %打开串口按钮回调函数中

        handles.double_vir=10;

        guidata(hObject, handles);

        %关闭串口按钮回调函数中

        a=handles.double_vir;

2.2 MATLAB对串口的控制

(1)MATLAB中主要是创建串行口设备对象,这里用到主要函数是serial();

s=serial(‘COM1’);%创建COM1为串口对象,并用s标识。

(2)然后是定义串口设备对象的通信属性,主要有波特率,异步串行格式(包括起始位、数据位、校验位、停止位等)和输出输入缓冲的大小等;

(3)用函数fopen()实现设备对象与硬件设备的软连接(相对于硬件设备的连接),这样就可以对数据的读写操作;

fopen(s)%打开s标识的串口;

(4)进行MATLAB串行读写操作,主要用到的函数有fscanf()等;

(5)关闭设备对象,用到了fclose()等函数。

在对串口按钮初始化中,采用触发中断的方式来进行事件的处理,要设置串口事件回调设置与回调函数,如下部分程序

%串口事件回调设置

s.BytesAvailableFcnMode='terminator';

s.BytesAvailableFcnCount=10;%输入缓冲区存在10个字节触发回调函数

s.BytesAvailableFcn={@EveBytesAvailableFcn,handles};%回调函数的指定

fopen(s);%打开串口

%回调函数

function EveBytesAvailableFcn(t,event,handles )

2.3 各控件的回调函数

[html]  view plain  copy
  1. <div><pre name="code" class="html">(1)初始设置一下系统openingFcn函数</strong>  
[html]  view plain  copy
  1. function Gui_Datadisplay_OpeningFcn(hObject, eventdata, handles, varargin)  
[html]  view plain  copy
  1. <span style="font-family: Arial, Helvetica, sans-serif;">% This function has no output args, see OutputFcn.</span>  
[html]  view plain  copy
  1. % hObject    handle to figure  
  2. % eventdata  reserved - to be defined in a future version of MATLAB  
  3. % handles    structure with handles and user data (see GUIDATA)  
  4. % varargin   command line arguments to Gui_Datadisplay (see VARARGIN)  
  5.    
  6. global COM;  
  7. global rate;  
  8. COM='COM7'%打开GUI界面时默认是COM7  
  9. rate = 115200;  
  10. set(handles.ppCOM,'value', 7);  
  11. set(handles.ppBaudRates,'value',1);  
  12. set(handles.pbCloseSerial,'Enable','off');</strong></span>  
[html]  view plain  copy
  1. <strong>(2)Open Serial控件的回调函数</strong>  
[html]  view plain  copy
  1. function pbOpenSerial_Callback(hObject, eventdata, handles)  
  2. % hObject    handle to pbOpenSerial (see GCBO)  
  3. % eventdata  reserved - to be defined in a future version of MATLAB  
  4. % handles    structure with handles and user data (see GUIDATA)  
  5. clc  
  6. instrreset  
  7. global s;  
  8. global rate;  
  9. global COM;  
  10. global out;  
  11. out=1;  
  12.    
  13. s=serial(COM);  
  14. set(s,'BaudRate',rate);%%%Baud¯  
  15. set(s,'DataBits',8);%%%  
  16. set(s,'StopBits',1);%%%  
  17. set(s,'InputBufferSize',1024000);%%%  
  18. set(handles.pbOpenSerial,'Enable','off');  
  19. set(handles.pbCloseSerial,'Enable','on');  
  20. %串口事件回调设置  
  21. s.BytesAvailableFcnMode='terminator';  
  22. s.BytesAvailableFcnCount=10; %  
  23. s.BytesAvailableFcn={@EveBytesAvailableFcn,handles};  
  24. fopen(s);%  
  25.     global count;  
  26. count=1;  
  27. fprintf('ceshi_dakaichuankou\n');</strong></span>  

 
[html]  view plain  copy
  1. <div><pre name="code" class="html">(3)当串口中断触发时,事件中断回调函数</strong></span>  
[html]  view plain  copy
  1. %回调函数</span>  
[html]  view plain  copy
  1. function EveBytesAvailableFcn( t,event,handles )  
  2. global s;  
  3. global a;  
  4. global d;  
  5. global arrX;  
  6. global arrY;  
  7. global arrZ;  
  8. global count;  
  9.    
  10. arrX=zeros([1,100]);  
  11. arrY=[1,1000];  
  12. arrZ=[1,1000];  
  13. % fprintf('Receive callback');  
  14. a=fscanf(s);%取出串口中陀螺仪数据  
  15. M=textscan(a,'%s%d%d%d','delimiter',' ');  
  16. data = [data , '\n'];  
  17. [Name,x,y,z] = deal(M{:});  
  18. arrX(1,count) = x;  
  19. % arrY(1,count) = y;  
  20. % arrZ(1,count) = z;  
  21. a = strcat(a ,char(10), get(handles.editR,'string'));  
  22. set(handles.editR,'string',a);  
  23. set(handles.text4,'string',x);  
  24. plot(arrX);  
  25. hold on;  
  26. count=count+1;  
  27. if count==100  
  28.     count=1;  
  29.     clf;  
  30. end</strong></span>  

 
[html]  view plain  copy
  1. <pre name="code" class="html">(4)COM口选择回调函数</strong></span>  
[html]  view plain  copy
  1. function ppCOM_Callback(hObject, eventdata, handles)  
  2. global COM;  
  3. rate=1;  
  4. val=get(hObject,'value');  
  5. switch val  
  6.     case 1  
  7.         COM='COM1';  
  8.         fprintf('ceshi_COM=1\n');  
  9.     case 2  
  10.         COM='COM2';  
  11.     case 3  
  12.         COM='COM3';  
  13.     case 4  
  14.         COM='COM4';  
  15.     case 5  
  16.         COM='COM5';  
  17.     case 6  
  18.         COM='COM6';  
  19.     case 7  
  20.         COM='COM7';  
  21.         fprintf('ceshi_COM=7\n');  
  22.     case 8  
  23.         COM='COM8';  
  24.     case 9  
  25.         COM='COM9';  
  26. End  
  27. </strong></span>  
 
 
[html]  view plain  copy
  1. <pre name="code" class="html"><pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">(5)波特率选择回调函数</span>  
[html]  view plain  copy
  1. function ppBaudRates_Callback(hObject, eventdata, handles)  
  2. global rate;  
  3. val=get(hObject,'value');  
  4. switch val  
  5.     case 1  
  6.         rate=115200;  
  7.     case 2  
  8.         rate=9600;  
  9. end   
  10. </strong></span>  
 
 
 
 
[html]  view plain  copy
  1. <pre name="code" class="html">(6)关闭串口回调函数</strong></span>  
[html]  view plain  copy
  1. function pbCloseSerial_Callback(hObject, eventdata, handles)  
  2. global s;  
  3. fclose(s);  
  4. delete(s);  
  5. set(handles.pbOpenSerial,'Enable','on');  
  6. set(handles.pbCloseSerial,'Enable','off');  
  7. fprintf('Close_COM');  
 
 
[html]  view plain  copy
  1. (7)发送回调函数  
  2. function pbSend_Callback(hObject, eventdata, handles)  
  3. global d;  
  4. d=get(handles.editT,'String');  
  5. set(handles.Value,'string',d);</strong></span>  
[html]  view plain  copy
  1. (8)清空发送区回调函数  
  2. function pbClearT_Callback(hObject, eventdata, handles)  
  3. set(handles.editT,'string','');  
[html]  view plain  copy
  1. (9)清空接收区回调函数  
  2. function pbClearR_Callback(hObject, eventdata, handles)  
  3. set(handles.editR,'string','');  
  4. set(handles.Value,'string','');  
  5. set(handles.text4,'string','');</strong></span>  

三、单片机串口发送
这一部分由个人不同的单片机发送的形式不一样,所以就不在此列举了。主要列出一下主函数参考。
[html]  view plain  copy
  1. <pre name="code" class="html">利用STM32接收到三轴加速度计MPU6050的数据,并将数据发送到串口  
  2. int main(void)  
  3. {     
  4.     USART1_Config();      
  5.     I2C_MPU6050_Init();       
  6.     InitMPU6050();    
  7. /***********************************************************************/  
  8.     while(1)  
  9.     {  
  10.     printf("Hello !");  
  11.           
  12.     printf("\r\n---------XYZ-------%d\r\n",GetData(ACCEL_XOUT_H));  
  13.         printf("\r\n---------XYZ------- %d \r\n",GetData(ACCEL_YOUT_H));      
[html]  view plain  copy
  1.         printf("\r\n---------XYZ------ %d \r\n",GetData(ACCEL_ZOUT_H));   
  2.         printf("\r\n \r\n");      
  3.           
  4.     printf("\r\n--------------------------------------\r\n");     
  5.     printf("\r\n \r\n     \r\n \r\n     \r\n \r\n");  
  6.           
  7.     delay_ms(8);  
  8.     }          
  9. }  
 
 四、运行结果 

单片机发送数据到PC,可利用MATLAB进行对数据的处理,在控制领域中有着广泛的应用。结果如图8,9.


图8


图9


主要参考来源:

http://blog.sina.com.cn/s/blog_4b94ff130100e7wt.html

http://d.g.wanfangdata.com.cn/Periodical_xddzjs201009012.aspx

http://d.g.wanfangdata.com.cn/Periodical_csjsllyj2011231494.aspx

资料附件:http://download.csdn.net/detail/u013381608/9092681

转载于http://blog.csdn.net/u013381608/article/details/48317225

  • 13
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 基于MATLAB GUI界面串口小助手是一个能够帮助用户进行串口通信的工具。该小助手可以通过MATLAB的图形用户界面(GUI)提供一个简单、直观的操作界面,帮助用户方便地进行串口通信的设置和数据传输。 首先,用户可以通过界面选择串口号和波特率,然后点击连接按钮来建立与目标设备的串口连接。连接成功后,用户可以通过界面发送和接收数据。可以通过界面输入数据,并点击发送按钮将数据发送给目标设备,同时可以实时显示接收到的数据。用户可以选择以ASCII格式或二进制格式发送和接收数据。 此外,该小助手还提供了一些其他功能,如自动识别可用的串口号、显示串口状态、设置数据位、停止位和校验位等等。用户还可以通过界面设置串口超时时间和读取缓冲区大小。 除了提供基本的串口通信功能外,该小助手还具备一些高级功能。例如,用户可以通过界面发送自定义的命令,以实现与目标设备的交互。用户还可以保存和加载已有的命令集,方便进行批量操作。 总之,基于MATLAB GUI界面串口小助手是一个方便、易用的工具,通过图形化的界面操作,帮助用户简化串口通信的设置和数据传输过程,提高工作效率,并且具有一些高级功能来满足更多的需求。 ### 回答2: 基于MATLAB GUI界面串口小助手可以是一个便于控制串口通信设备的工具。它可以通过MATLABGUI界面串口通信设备进行数据的发送和接收。 这个小助手的主要功能包括: 1. 串口配置:通过GUI界面设置串口的端口号、波特率、数据位、校验位和停止位等参数,以便与目标串口设备建立连接。 2. 发送数据:用户可以在GUI界面上输入要发送的数据,然后点击发送按钮,将数据发送到已配置的串口设备上。 3. 接收数据:小助手可以通过串口接收来自目标串口设备的数据,并将其显示在GUI界面上,方便用户查看和分析接收到的数据。 4. 数据解析:小助手可以根据用户需求对接收到的数据进行解析,如将接收到的二进制数据转换为十进制数值、字符串或图形等形式。 5. 自动化控制:用户可以通过小助手实现自动化的串口通信控制,如定时发送指令、定时接收数据或自定义发送/接收规则等。 在实际应用中,这个基于MATLAB GUI界面串口小助手可以被广泛应用于各种需要与串口设备通信的领域,如仪器仪表控制、工业自动化、物联网设备、机器人控制等。它为用户提供了一个便捷而直观的方式来控制和监控串口通信,并能够根据用户的需求进行灵活的数据处理和分析操作。在MATLAB的支持下,用户可以根据实际需求自定义和扩展小助手的功能,使其更好地适应不同的应用场景。 ### 回答3: 基于Matlab GUI界面串口小助手是一种利用Matlab开发的应用程序,可以通过串口与外部设备进行通信。该小助手提供了一个图形化界面,用户可以通过界面上的按钮和输入框实现与外部设备的交互。 该串口小助手的主要功能包括串口的打开与关闭、波特率的设置、发送和接收数据等。 通过界面上的打开按钮,用户可以选择要使用的串口,并指定串口的波特率。打开串口后,用户可以在发送数据的输入框中输入要发送的数据,并通过发送按钮将数据发送给外部设备。 同时,该小助手还提供了接收数据的窗口,用户可以通过接收按钮监听串口接收到的数据,并将其显示在接收数据的窗口中。 该小助手还支持数据的存储和读取功能。用户可以通过保存按钮将接收到的数据保存到本地文件中,而后可以通过读取按钮将保存的数据读取并显示在接收数据的窗口中。 此外,该小助手还可以显示串口连接状态,提醒用户当前串口连接是否正常。 总的来说,基于Matlab GUI界面串口小助手提供了一种便捷的方式来进行串口通信。它的图形化界面使得操作更加直观和友好,而且它可以扩展和定制各种功能,满足不同用户的需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值