本文主要介绍如何利用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 各控件的回调函数
(1)初始设置一下系统openingFcn函数
function Gui_Datadisplay_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.1% hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Gui_Datadisplay (see VARARGIN) global COM; global rate; COM='COM7'%打开GUI界面时默认是COM7 rate = 115200; set(handles.ppCOM,'value', 7); set(handles.ppBaudRates,'value',1); set(handles.pbCloseSerial,'Enable','off');123456789101112
(2)Open Serial控件的回调函数
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) clc instrreset global s; global rate; global COM; global out; out=1; s=serial(COM); set(s,'BaudRate',rate);%%%Baud¯ set(s,'DataBits',8);%%% set(s,'StopBits',1);%%% set(s,'InputBufferSize',1024000);%%% set(handles.pbOpenSerial,'Enable','off'); set(handles.pbCloseSerial,'Enable','on'); %串口事件回调设置 s.BytesAvailableFcnMode='terminator'; s.BytesAvailableFcnCount=10; % s.BytesAvailableFcn={@EveBytesAvailableFcn,handles}; fopen(s);% global count; count=1; fprintf('ceshi_dakaichuankoun');123456789101112131415161718192021222324252627
(3)当串口中断触发时,事件中断回调函数
%回调函数 function EveBytesAvailableFcn( t,event,handles ) global s; global a; global d; global arrX; global arrY; global arrZ; global count; arrX=zeros([1,100]); % arrY=[1,1000]; % arrZ=[1,1000]; % fprintf('Receive callback'); a=fscanf(s);%取出串口中陀螺仪数据 M=textscan(a,'%s%d%d%d','delimiter',' '); % data = [data , 'n']; [Name,x,y,z] = deal(M{:}); arrX(1,count) = x; % arrY(1,count) = y; % arrZ(1,count) = z; a = strcat(a ,char(10), get(handles.editR,'string')); set(handles.editR,'string',a); set(handles.text4,'string',x); plot(arrX); hold on; count=count+1; if count==100 count=1; clf; end1234567891011121314151617181920212223242526272829303132
(4)COM口选择回调函数
function ppCOM_Callback(hObject, eventdata, handles) global COM; rate=1; val=get(hObject,'value'); switch val case 1 COM='COM1'; fprintf('ceshi_COM=1n'); case 2 COM='COM2'; case 3 COM='COM3'; case 4 COM='COM4'; case 5 COM='COM5'; case 6 COM='COM6'; case 7 COM='COM7'; fprintf('ceshi_COM=7n'); case 8 COM='COM8'; case 9 COM='COM9'; End1234567891011121314151617181920212223242526
(5)波特率选择回调函数
function ppBaudRates_Callback(hObject, eventdata, handles) global rate; val=get(hObject,'value'); switch val case 1 rate=115200; case 2 rate=9600; end 123456789
(6)关闭串口回调函数
function pbCloseSerial_Callback(hObject, eventdata, handles) global s; fclose(s); delete(s); set(handles.pbOpenSerial,'Enable','on'); set(handles.pbCloseSerial,'Enable','off'); fprintf('Close_COM'); 1234567
(7)发送回调函数
function pbSend_Callback(hObject, eventdata, handles) global d; d=get(handles.editT,'String'); set(handles.Value,'string',d); 1234(8)清空发送区回调函数 1function pbClearT_Callback(hObject, eventdata, handles) set(handles.editT,'string',''); 12(9)清空接收区回调函数 1function pbClearR_Callback(hObject, eventdata, handles) set(handles.editR,'string',''); set(handles.Value,'string',''); set(handles.text4,'string','');1234
三、单片机串口发送
这一部分由个人不同的单片机发送的形式不一样,所以就不在此列举了。主要列出一下主函数参考。
利用STM32接收到三轴加速度计MPU6050的数据,并将数据发送到串口
int main(void) { USART1_Config(); I2C_MPU6050_Init(); InitMPU6050(); /***********************************************************************/ while(1) { printf("Hello !"); printf("rn---------XYZ-------%drn",GetData(ACCEL_XOUT_H)); printf("rn---------XYZ------- %d rn",GetData(ACCEL_YOUT_H)); printf("rn---------XYZ------ %d rn",GetData(ACCEL_ZOUT_H)); printf("rn rn"); printf("rn--------------------------------------rn"); printf("rn rn rn rn rn rn"); delay_ms(8); } }
四、运行结果
单片机发送数据到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
没有资源分的可以利用网盘下载[2019/2/28更新]:链接: https://pan.baidu.com/s/1RN7_0If3Hi6I0q9AOPTDoA 提取码: dfdz 复制这段内容后打开百度网盘手机App,操作更方便哦
本文主要介绍如何利用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 各控件的回调函数
(1)初始设置一下系统openingFcn函数
function Gui_Datadisplay_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.1% hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Gui_Datadisplay (see VARARGIN) global COM; global rate; COM='COM7'%打开GUI界面时默认是COM7 rate = 115200; set(handles.ppCOM,'value', 7); set(handles.ppBaudRates,'value',1); set(handles.pbCloseSerial,'Enable','off');123456789101112
(2)Open Serial控件的回调函数
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) clc instrreset global s; global rate; global COM; global out; out=1; s=serial(COM); set(s,'BaudRate',rate);%%%Baud¯ set(s,'DataBits',8);%%% set(s,'StopBits',1);%%% set(s,'InputBufferSize',1024000);%%% set(handles.pbOpenSerial,'Enable','off'); set(handles.pbCloseSerial,'Enable','on'); %串口事件回调设置 s.BytesAvailableFcnMode='terminator'; s.BytesAvailableFcnCount=10; % s.BytesAvailableFcn={@EveBytesAvailableFcn,handles}; fopen(s);% global count; count=1; fprintf('ceshi_dakaichuankoun');123456789101112131415161718192021222324252627
(3)当串口中断触发时,事件中断回调函数
%回调函数 function EveBytesAvailableFcn( t,event,handles ) global s; global a; global d; global arrX; global arrY; global arrZ; global count; arrX=zeros([1,100]); % arrY=[1,1000]; % arrZ=[1,1000]; % fprintf('Receive callback'); a=fscanf(s);%取出串口中陀螺仪数据 M=textscan(a,'%s%d%d%d','delimiter',' '); % data = [data , 'n']; [Name,x,y,z] = deal(M{:}); arrX(1,count) = x; % arrY(1,count) = y; % arrZ(1,count) = z; a = strcat(a ,char(10), get(handles.editR,'string')); set(handles.editR,'string',a); set(handles.text4,'string',x); plot(arrX); hold on; count=count+1; if count==100 count=1; clf; end1234567891011121314151617181920212223242526272829303132
(4)COM口选择回调函数
function ppCOM_Callback(hObject, eventdata, handles) global COM; rate=1; val=get(hObject,'value'); switch val case 1 COM='COM1'; fprintf('ceshi_COM=1n'); case 2 COM='COM2'; case 3 COM='COM3'; case 4 COM='COM4'; case 5 COM='COM5'; case 6 COM='COM6'; case 7 COM='COM7'; fprintf('ceshi_COM=7n'); case 8 COM='COM8'; case 9 COM='COM9'; End1234567891011121314151617181920212223242526
(5)波特率选择回调函数
function ppBaudRates_Callback(hObject, eventdata, handles) global rate; val=get(hObject,'value'); switch val case 1 rate=115200; case 2 rate=9600; end 123456789
(6)关闭串口回调函数
function pbCloseSerial_Callback(hObject, eventdata, handles) global s; fclose(s); delete(s); set(handles.pbOpenSerial,'Enable','on'); set(handles.pbCloseSerial,'Enable','off'); fprintf('Close_COM'); 1234567
(7)发送回调函数
function pbSend_Callback(hObject, eventdata, handles) global d; d=get(handles.editT,'String'); set(handles.Value,'string',d); 1234(8)清空发送区回调函数 1function pbClearT_Callback(hObject, eventdata, handles) set(handles.editT,'string',''); 12(9)清空接收区回调函数 1function pbClearR_Callback(hObject, eventdata, handles) set(handles.editR,'string',''); set(handles.Value,'string',''); set(handles.text4,'string','');1234
三、单片机串口发送
这一部分由个人不同的单片机发送的形式不一样,所以就不在此列举了。主要列出一下主函数参考。
利用STM32接收到三轴加速度计MPU6050的数据,并将数据发送到串口
int main(void) { USART1_Config(); I2C_MPU6050_Init(); InitMPU6050(); /***********************************************************************/ while(1) { printf("Hello !"); printf("rn---------XYZ-------%drn",GetData(ACCEL_XOUT_H)); printf("rn---------XYZ------- %d rn",GetData(ACCEL_YOUT_H)); printf("rn---------XYZ------ %d rn",GetData(ACCEL_ZOUT_H)); printf("rn rn"); printf("rn--------------------------------------rn"); printf("rn rn rn rn rn rn"); delay_ms(8); } }
四、运行结果
单片机发送数据到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
没有资源分的可以利用网盘下载[2019/2/28更新]:链接: https://pan.baidu.com/s/1RN7_0If3Hi6I0q9AOPTDoA 提取码: dfdz 复制这段内容后打开百度网盘手机App,操作更方便哦
举报