程序說明 V1.0 2015/2/08 |
MATLAB串口操作和GUI編程 |
概述 |
本文介紹了程序AD9512_Serial_GUI的編程思路和功能。該程序設計到MATLAB的圖像用戶界面編程的基本方法和串口的基本操作。程序目的在於通過串口寫控制字對AD9512進行配置(AD9512通過SPI寫入寄存器,本程序只是整個控制程序中的一部分)。 |
修訂歷史 |
以下表格展示了本文檔的修訂過程
[1]. 試驗版本表明該版本應用筆記及對應代碼沒有通過實際驗證,同時仿真分析也可能沒有進行。試驗版對應的版本號為V0.X。 [2]. 寫入操作時將 'async' 去掉,基本通過驗證,同時由於RS232寫入是LSB的順序,和FPGA端代碼不匹配,因此此處更改了serialwrite程序。 |
簡介 |
本程序基於MATLAB 2014a 編寫,本文檔中提到的"MATLAB"均指該特定版本MATLAB。 本程序想要實現的功能是:上位機控制AD9512,當然AD9512是和FPGA相連的,而FPGA通過串口和上位機連接。AD9512的控制方法參見其DataSheet,通過SPI配置。從原理上來說,SPI和UART都是全雙工的,但是讀取過程中也需要寫入控制頭,此處采用的是半雙工方式。 本程序的思路在於將FPGA看作是一個UART轉SPI的器件,直接通過上位機配置AD9512。FPGA端的處理暫時不考慮,本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,按照其中的例子自己完成一次,並了解其基本原理后,了解這個程序就十分容易了。 |
程序設計 |
程序設計流程按以下流程進行:
需求 程序功能分簡單,具體來說只需要實現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訪問。 本版程序對部分操作有相應的處理,然而很不完善。這也說明看似簡單的東西也需要仔細思索,做起來往往不是那么容易。 功能實現 本程序中有三個函數,包括
將其寫出函數而不保留在主程序內的優點暫時看來有兩點:其一是主程序過長而且大部分內容是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編程(第二版)- 菜鳥入門教材 |
代碼 |
|