久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

基于MATLAB GUI界面的MCU串口實(shí)時(shí)繪圖設(shè)計(jì)

 advanced00 2017-10-01

本文主要介紹如何利用MATLAB中的GUI工具來(lái)制作串口通信上位機(jī),然后利用單片機(jī)讀取陀螺儀MPU6050的

數(shù)據(jù)傳送到上位機(jī),,利用上位機(jī)將數(shù)據(jù)利用繪圖實(shí)時(shí)顯示出來(lái),,有一部分是參考網(wǎng)上其它教程,

將在結(jié)尾給出參考網(wǎng)址,。

一,、總體設(shè)計(jì)原理

PC機(jī)有USB接口,可以實(shí)現(xiàn)串口通信,,通過(guò)USB轉(zhuǎn)串口數(shù)據(jù)線連接單片機(jī),,用三根線(收、發(fā),、地)來(lái)實(shí)現(xiàn)數(shù)

據(jù)的發(fā)送,,用PL-2303HX作為單片機(jī)與PC機(jī)間的驅(qū)動(dòng)芯片。串口通信總體設(shè)計(jì)原理圖如圖1所示,。


圖1


二,、MATLAB的GUI串口通信設(shè)計(jì)

GUIDE是一個(gè)專用于GUI程序設(shè)計(jì)的向?qū)гO(shè)計(jì)器。而GUI是由各種圖形對(duì)象,,如圖形窗口,、圖軸、菜單,、按鈕,、

文本框等構(gòu)建的用戶界面,是人機(jī)交互的有效工具和方法,,通過(guò)GUIDE可以很方便地設(shè)計(jì)出各種符合要求的

圖形用戶界面,。用戶可以根據(jù)界面提示完成整個(gè)工程,卻不必去了解工程內(nèi)部是如何工作的,。GUI設(shè)計(jì)既

可以以基本的MATLAB程序設(shè)計(jì)為主,,也可以以鼠標(biāo)為主利用GUIDE工具進(jìn)行設(shè)計(jì),

也可綜合以上兩種方法進(jìn)行設(shè)計(jì),。

2.1  GUI界面的整體布局設(shè)計(jì)

利用MATLAB的GUI界面設(shè)計(jì)程序界面和功能,,利用MATLAB R2014a來(lái)實(shí)現(xiàn)設(shè)計(jì),打開MATLAB后:

1,、在命令行窗口輸入”guide”調(diào)出GUIDE工具,,如圖2

圖2

2,、直接選擇默認(rèn)方式,勾選“將新圖形另存為”,,選擇自己要存的位置,,然后點(diǎn)擊OK。出現(xiàn)如下圖3所示:

圖3


3,、MALTAB的GUI主要由兩個(gè)文件,,當(dāng)設(shè)置好GUIDE時(shí)點(diǎn)擊保存,這時(shí)將在當(dāng)前路徑自動(dòng)產(chǎn)生兩個(gè)名字相同的文件,,但擴(kuò)展標(biāo)識(shí)符不同,,一個(gè)為.fig文件,一個(gè)為.m文件,,.fig主要是GUI圖形文件,,和GUIDE設(shè)計(jì)的圖像相同,.m文件為程序文件,,所有事件響應(yīng)和計(jì)算功能都在這里實(shí)現(xiàn),。

在圖4中,可以在左側(cè)的控件欄拖曳控件到右側(cè)網(wǎng)格中,,如圖4

圖4

4,、控件設(shè)置,右擊控件點(diǎn)“Property Inspector”或雙擊控件,,如圖5

圖5


一般僅設(shè)置Tag選項(xiàng)和String選項(xiàng),。其中String選項(xiàng)在按鈕控件中就是GUI顯示時(shí)的字符。Tag屬性較為重要,,在GUI編程時(shí)控件的索引主要利用Tag選項(xiàng)的屬性并且在GUI生成回調(diào)函數(shù)時(shí)候也是由Tag屬性的值命名的,。這里將“打開串口”按鈕控件的String設(shè)置為“打開串口”,tag設(shè)置為pbOpenSerial,。

5,、其他設(shè)置可重復(fù)以上步驟來(lái)放置和設(shè)置各個(gè)控件,都所有控件設(shè)置好之后,,要保存一下,,然后點(diǎn)擊右側(cè)的“.m”文件可以看到相對(duì)應(yīng)的控件的程序設(shè)計(jì)區(qū)。

MATLAB的按鈕以及各種控件事件響應(yīng)是依靠一種叫做回調(diào)函數(shù)(Callback Function)來(lái)實(shí)現(xiàn)的,,自動(dòng)生成的M文件中已經(jīng)自動(dòng)做好回調(diào)函數(shù)的名稱和參數(shù)了,,我們需要做的就是在其中添加你要進(jìn)行的處理。

例如:我們要在鼠標(biāo)單擊按鈕“打開串口”時(shí)進(jìn)行一系列的串口初始化動(dòng)作,,這時(shí)右鍵單擊“打開串口按鈕”如圖6,,7

圖6

圖7


按鈕的Tag為pbOpenSerial,所以GUIDE自動(dòng)生成的回調(diào)函數(shù)名為pbOpenSerial_Callback,函數(shù)有3個(gè)參數(shù)

·hObject是當(dāng)前控件對(duì)象,即打開串口按鈕對(duì)象(面向?qū)ο蠹夹g(shù)中的概念),,索引或設(shè)置當(dāng)前對(duì)象(打開串口按鈕對(duì)象)時(shí)只需要引用hObject就可以了,。例如:改變當(dāng)前空間的可見性,只需調(diào)用set(hObject,'Visable','off');打開串口對(duì)象在單擊該按鈕時(shí)即會(huì)隱藏,。

·eventdata我暫時(shí)沒有用到,,所以暫且不管他

·handles我理解是整個(gè)GUI界面的索引句柄,所有GUI界面上的控件都可以通過(guò)他來(lái)索引,,幾乎有全局作用域,,例如在打開串口按鈕的回調(diào)中要將關(guān)閉串口按鈕顯示出來(lái),,可以這樣調(diào)用:

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

這里handles還有一個(gè)作用就是在不同控件間進(jìn)行參數(shù)傳遞,只要對(duì)handle的成員變量進(jìn)行賦值就可以了,。當(dāng)然后面要調(diào)用一下guidata(hObject,handles);將變量保存,。

例如打開串口按鈕里面有個(gè)數(shù)據(jù)10需要關(guān)閉串口按鈕調(diào)用可以這樣寫。

        %打開串口按鈕回調(diào)函數(shù)中

        handles.double_vir=10;

        guidata(hObject, handles);

        %關(guān)閉串口按鈕回調(diào)函數(shù)中

        a=handles.double_vir;

2.2 MATLAB對(duì)串口的控制

(1)MATLAB中主要是創(chuàng)建串行口設(shè)備對(duì)象,,這里用到主要函數(shù)是serial(),;

s=serial(‘COM1’);%創(chuàng)建COM1為串口對(duì)象,并用s標(biāo)識(shí),。

(2)然后是定義串口設(shè)備對(duì)象的通信屬性,,主要有波特率,異步串行格式(包括起始位,、數(shù)據(jù)位,、校驗(yàn)位、停止位等)和輸出輸入緩沖的大小等,;

(3)用函數(shù)fopen()實(shí)現(xiàn)設(shè)備對(duì)象與硬件設(shè)備的軟連接(相對(duì)于硬件設(shè)備的連接),,這樣就可以對(duì)數(shù)據(jù)的讀寫操作;

fopen(s)%打開s標(biāo)識(shí)的串口,;

(4)進(jìn)行MATLAB串行讀寫操作,,主要用到的函數(shù)有fscanf()等;

(5)關(guān)閉設(shè)備對(duì)象,,用到了fclose()等函數(shù),。

在對(duì)串口按鈕初始化中,采用觸發(fā)中斷的方式來(lái)進(jìn)行事件的處理,,要設(shè)置串口事件回調(diào)設(shè)置與回調(diào)函數(shù),,如下部分程序

%串口事件回調(diào)設(shè)置

s.BytesAvailableFcnMode='terminator';

s.BytesAvailableFcnCount=10;%輸入緩沖區(qū)存在10個(gè)字節(jié)觸發(fā)回調(diào)函數(shù)

s.BytesAvailableFcn={@EveBytesAvailableFcn,handles};%回調(diào)函數(shù)的指定

fopen(s);%打開串口

%回調(diào)函數(shù)

function EveBytesAvailableFcn(t,event,handles )

2.3 各控件的回調(diào)函數(shù)

[html] view plain copy
  1. <div><pre name='code' class='html'>(1)初始設(shè)置一下系統(tǒng)openingFcn函數(shù)</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界面時(shí)默認(rèn)是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控件的回調(diào)函數(shù)</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. %串口事件回調(diào)設(shè)置  
  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)當(dāng)串口中斷觸發(fā)時(shí),事件中斷回調(diào)函數(shù)</strong></span>  
[html] view plain copy
  1. %回調(diào)函數(shù)</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);%取出串口中陀螺儀數(shù)據(jù)  
  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口選擇回調(diào)函數(shù)</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)波特率選擇回調(diào)函數(shù)</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)關(guān)閉串口回調(diào)函數(shù)</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)發(fā)送回調(diào)函數(shù)  
  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)清空發(fā)送區(qū)回調(diào)函數(shù)  
  2. function pbClearT_Callback(hObject, eventdata, handles)  
  3. set(handles.editT,'string','');  
[html] view plain copy
  1. (9)清空接收區(qū)回調(diào)函數(shù)  
  2. function pbClearR_Callback(hObject, eventdata, handles)  
  3. set(handles.editR,'string','');  
  4. set(handles.Value,'string','');  
  5. set(handles.text4,'string','');</strong></span>  

三,、單片機(jī)串口發(fā)送
這一部分由個(gè)人不同的單片機(jī)發(fā)送的形式不一樣,,所以就不在此列舉了。主要列出一下主函數(shù)參考,。
[html] view plain copy
  1. <pre name='code' class='html'>利用STM32接收到三軸加速度計(jì)MPU6050的數(shù)據(jù),,并將數(shù)據(jù)發(fā)送到串口  
  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. }  
四,、運(yùn)行結(jié)果

單片機(jī)發(fā)送數(shù)據(jù)到PC,可利用MATLAB進(jìn)行對(duì)數(shù)據(jù)的處理,,在控制領(lǐng)域中有著廣泛的應(yīng)用,。結(jié)果如圖8,9.


圖8


圖9


主要參考來(lái)源:

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

轉(zhuǎn)載于http://blog.csdn.net/u013381608/article/details/48317225

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多