前言:我們精心挑選了數篇優質接口設計論文文章,供您閱讀參考。期待這些文章能為您帶來啟發,助您在寫作的道路上更上一層樓。

1.1接口描述當傳感器網絡的Zigbee網關節點不斷地將網絡節點中監測到的溫度、煙霧等信息發送給上位機時,上位機的通信模塊必須及時響應接收數據。數據監測上位機通信接口采用VB6.0中MSComm控件,利用串行端口傳輸和接收數據,為應用程序提供串行通信功能,具體包括2種處理通訊方式,一種是事件驅動通訊,利用OnComm捕獲并處理通訊時間;另一種是通過檢查CommEvent的值,來查詢事件和錯誤[5]。設計中采用第1種方式,在用戶界面設置好相應的控制參數,如波特率為38400bps、無校驗位、8數據位、1位停止位等。當傳感器網絡節點監測的的溫度、煙霧等信息發送給上位機時,將觸發監測程序中MSComm控件的OnComm事件,進而改變ComEvent的值,程序根據ComEvent的值執行相應的操作,如解析數據、發送數據、錯誤分析等,然后更新內存節點樹中當前節點的實時數據、采集信息(如溫度、煙霧等)存入數據庫。
1.2實現方法MSComm控件可以設置以二進制或者以文本方式接收,若設置為二進制接受,控件會自動將其轉變成十進制。在該系統中,數據幀的數據是十六進制的,設置以二進制方式進行接收,從接收緩存中獲取到的是十進制的數據。
2數據結構與數據解析
2.1內存中節點多叉樹的建立圖2節點數據結構圖通信監測模塊接收數據后,為了便于以圖形方式實時顯示網絡拓撲和節點監測信息,以及提高查詢數據的運行速度,需要在內存中構建一個動態多叉樹,用于存儲節點最新的數據信息。節點數據結構圖如圖2所示。在內存中建立一個關于節點的動態多叉樹,節點的唯一標識是它的自身ID,根據數據幀中包含的父子關系可構建出一棵多叉樹。首先定義一個名為treeNode的類,它的每一個實例都代表著一個節點,里面包含節點的屬性(例如ID、溫度、煙霧等)和方法(例如獲取類中節點數據的getData方法)。為了將節點間的父子關系表現出來,可在類treeNode中定義一個類型為treeNode的動態數組NodeChild(),用于存放子節點。如某節點ID為0000,子節點ID為0001,將子節點0001存放在節點0000的NodeChild()數組中,即可完成節點間的連接。當需要找某個節點時,從根節點開始查找,若根節點的孩子沒有要找的節點,則查找根節點的孩子的孩子,直到遍歷完所有節點。當某數據幀發送到上位機時,解析出來的原始數據分別放在相應的變量,假設原始的溫度數據是3F4A,數據結構中溫度變量名為Temperature,類型為String,則直接將3F4A轉換為String類型存在Temperature中。按上述方法構建的動態多叉樹能夠適應網絡拓撲動態變化的應用場景,相比于定長的數組,其更為節省內存,不足之處是查詢算法較復雜。
2.2數據解析通信監測模塊接收到Zigbee網關節點發送來的一組數據(數據幀)后,需要對收到的數據進行協議解析,然后根據解析數據建立當前動態多叉樹。由于通信中難以避免數據幀出錯、截斷、丟失等情況,故數據解析部分根據數據幀的格式制定了一套協議,丟棄異常數據幀。數據幀的部分格式如下:FFXXXXXXXXFF01XXXX02XXXX2FF之間,開頭2個字節為節點ID,緊跟的2個字節節點的父ID01代表溫度類型,后面2個字節是溫度數值02代表煙霧類型,后面2個字節是煙霧值,依次類推…。2個FF后的字節都是數據,其格式如下:數據類型(01,溫度類型)+2個字節的數據(XXXX)。具體操作流程如圖3所示。首先檢驗從串口進來的數據幀開頭一個字節是否FF,若是,則開始解析。直到下一個FF,則節點ID部分解析結束,后面都是數據。繼續讀取下一個字節,若為01,則將后面緊跟的兩個字節存進相應的溫度變量,讀取下一個字符;若該字節所表示的數據類型未定義則跳過該字節及后面緊跟的兩個字節,繼續讀取下一個字符。該過程一直執行直到解析完整個數據幀。由于數據幀是不定長的,而且沒有結束字符,所以每收到一個數據幀程序便立即從緩存中讀取并解析,以避免多個幀合并為一個數據幀導致解析錯誤。當出現多個數據幀并合情況時,則丟棄后繼的幀。在幀解析完畢后,可以對解析出來的監測數據信息進行處理,將數據信息一份存進內存中節點多叉樹,一份存進數據庫,實現實時更新數據和記錄當前信息。以下是有關串口通信事件響應及數據解析的部分代碼:
3數據庫的構建與連接
3.1數據庫關系數據庫關系圖如圖4所示。由于每個節點都有大量歷史數據,所以每一個節點都創建一個表;USERS表用于保存監測系統的用戶信息;NodeTran用于保存數據幀轉發路徑;Nodelist用于保存節點列表;Limit用于保存監測系統的閾值管理設置值;Node_XXXX為節點XXXX的歷史數據表。除了用戶表,所有數據都采用varchar類型。
3.2存儲過程的創建為了提高通信監測模塊與數據庫之間通信的效率,將一些常用且較為復雜的SQL語句存放在數據庫中,使用時只需要調用存儲過程,輸入必要的參數即可完成相應的SQL語句操作,這樣可以大大減少程序與數據庫之間的通信量。
3.3使用ADO將VB6.0與SQL2005連接ADO是為Microsoft最新和最強大的數據訪問范例OLEDB而設計的,擁有一個易于使用的應用程序層接口。通過使用ADO2.0對象模型中的Recordset和Connection對象實現兩者連接和數據的存取。Connection對象包含關于某個數據提供程序的信息,如數據庫用戶、密碼、數據庫名等;Recordset對象包含某個查詢返回的記錄,可以創建一個Connection對象,在同一個連接上打開多個Recordset對象[8]。操作流程圖如圖5所示。
4結語
本設計采用了Xilinx公司提供的ISE為開發平臺。ISE軟件是Xilinx公司推出的FPGA/CPLD集成開發環境,不僅包含了邏輯設計所需的一切,還具有大量的簡便易用的內置式工具和向導,使得I/O分配、功耗分析、時序驅動設計收斂、HDL仿真等關鍵步驟變得容易而直觀。因此要掌握XilinxFPGA開發,就必須掌握ISE。ISE界面友好、操作簡單、集成度高。利用ISE進行FPGA邏輯設計的主要流程包括設計輸入、功能仿真、設計綜合、設計實現和配置下載,簡易設計流程圖如圖1所示。
2ISA總線邏輯接口設計
ISA總線:(IndustryStandardArchitecture:工業標準體系結構)是IBM公司為PC/AT電腦而制定的總線標準,也稱為AT標準,為8/16位體系結構,最高工作頻率為8MHz,數據傳輸率大約是16MB/S,地址線24條,可尋訪16M字節地址單元。由于本文使ISA總線工作在8位I/O傳輸模式,使用了ISA總線信號中的時鐘線(ISA_CLK)、地址線(ISA_ADDR):A0~A9、數據線(ISA_DATA):D0~D7、讀信號線(ISA_IOR)、寫信號線(ISA_IOW)、地址鎖存使能(ISA_ALE)、地址選通信號(ISA_AEN)等。本設計采用了與C語言較為相似的VERILOGHDL硬件描述語言對ISA總線邏輯接口進行了描述。
本文要實現的是ISA接口通過FPGA訪問串口芯片16C554,16C554是內部帶有16字節收發FIFO的通用異步收發器,具有獨立的收發控制電路。4路標準的MODEM接口,通過軟件可分別設置允許每一路中斷。波特率、數據幀格式等也都可由軟件編程設置。具體硬件結構如圖。由圖2可知上位機通過ISA總線對串口芯片16C554串口芯片的訪問需要FPGA作為橋接媒介,因此串口芯片的控制信號均由FPGA給出,其邏輯控制信號的VERILOG描述如下。當上位機對串口芯片進行讀寫時,首先需要通過FPGA將ISA地址信號譯碼為芯片的片選信號,設置串口芯片基地址為0x300,由于9位地址線的低三位為串口芯片的內部地址,因此芯片的片選信號由地址總線的高七位決定。
3結束語
為了驗證基于FPGA的ISA邏輯接口的正確性,將上述邏輯接口利用VERILOG硬件描述語言在賽靈思提供的集成開發環境ISE中實現。
CY7C68013A固件程序是指在EZ⁃USB芯片內部RAM中運行的程序代碼,固件程序是USB接口設計的核心部分。固件代碼的作用就是控制芯片執行指定的設備功能,即處理上位機下傳的各種USB設備請求,控制芯片與電路進行數據傳輸。EZ⁃USB芯片內部集成增強型8051內核,USB芯片的固件程序實際上就是單片機程序文件,可以采用匯編語言或C語言編寫。CYPRESS公司提供的EZ⁃USBFX2固件程序開發包中提供了固件程序的基本框架,這為用戶開發基于EZ⁃USBFX2芯片的USB設備提供了很大的方便。
1.1固件框架固件程序框架主要包括設備初始化,處理標準USB設備請求和USB掛起時的電源管理等。程序框架使用KeilC51編寫,它是現成的直接可以編譯為HEX文件的8051程序代碼,使用者只需要改寫USB描述表,在一些固定函數下添加功能代碼,主要是EZ⁃USB芯片的初始化配置和實現USB外設功能的代碼。固件框架的流程圖如圖2所示[4]。復位后固件先初始化一些全局變量,然后調用初始化函數TD_Init(),該函數初始化USB設備到沒有配置的狀態,并打開中斷。循環1s進行一次設備重枚舉,直到端點0收到一SETUP包,然后進入while循環語句,開始TD_Poll任務處理函數。依次執行下列過程:(1)TD_Poll()用戶任務調度函數;(2)如果發現USB設備請求,則分析該請求并執行;(3)如果收到USB掛起信號,則調用TD_Suspend()掛起函數,內核掛起,直到出現USB遠程喚醒信號,調用TD_Resume(),內核喚醒,從新進入while循環。固件框架包含的文件如表1所示。
1.2固件代碼編寫USB固件程序主要的功能有2個:一是PC機的Windows系統能夠檢測與識別相應設備;二是數據的上傳與下傳。Cypress公司為EZ⁃USBFX2系列芯片提供的固件程序框架極大的簡化了固件開發。一般的固件開發只需要修改用戶調度函數文件Periph.c與USB描述符列表文件Dscr.a51,這兩個文件在KeilC51編程器中都可打開。Periph.c文件中只需要修改TD_Init()與TD_Poll()函數。在本設計中為了能進行高速的數據傳輸,EZ⁃USB芯片采用SlaveFIFO接口方式。此方式下,USB內核不參與數據的傳輸,所以TD_Poll()函數不用寫代碼,設置成空函數就可以了。這樣USB固件程序的開發主要任務就是改寫TD_Init()函數與USB描述符列表文件Dscr.a51。在本設計中配置端點6傳輸方向為IN,傳輸方式為塊傳輸,緩沖大小設置為1024B,深度為2級,作用是上傳采集的數據。配置端點2傳輸方向為OUT,傳輸方式為塊傳輸,緩沖大小設置為1024B,深度為2級,作用是下傳FPGA的命令配置參數。固件程序的編譯使用KeilμVision2集成編譯環境,集成編譯環境中包括有C51編譯器,A51匯編器等工具與調試器。代碼中還需包含頭文件FX2.h與Fx2regs.h,庫文件Ezusb.lib。對修改后的代碼進行編譯與鏈接,最后生成HEX文件。HEX文件可直接下載到EZ⁃USB中運行。HEX文件也可根據需要通過CYPRESS公司提供的EZ⁃USBFX2固件開發包中的Hex2bit.exe應用工具生成IIC文件,IIC文件用于燒寫到EEPROM中。
2固件程序的裝載
CY7C68013A芯片集成增強型8051內核,內部無ROM等永久性存儲器,每次上電后需要從新將固件程序載入到片內RAM中。EZ⁃USBFX2固件程序有3種加載方式:(1)如果沒有片外存儲器連接到EZ⁃USBFX2上,或者所讀取的首字節不是0xC0或0xC2,則芯片枚舉為缺省的USB設備,其中描述符,VID,PID由芯片內部硬件邏輯提供。然后固件程序與描述符表由主機下載,EZ⁃USBFX2開始執行下載的代碼,首先模擬物理電路的斷開與連接,此時EZ⁃USBFX2將再次進行設備枚舉,這稱為重枚舉,重枚舉將根據下載的代碼對設備進行從新定義。(2)如果USB檢測到一個E2PROM,其首字節為0xC0時,芯片也枚舉為缺省的USB設備,但VID與PID值將從此EEPROM中讀取,USB描述符由芯片內部提供。這種模式稱為“C0”加載。主機根據讀得的VID與PID值,由固件下載驅動程序將指定的固件程序下載到EZ⁃USBFX2,然后再重枚舉。(3)如果USB檢測到一個E2PROM,其首字節為0xC2時,固件程序將從此E2PROM中自動下載到FX2芯片上,CPU通過復位后運行下載的程序代碼。這種模式稱為“C2”加載。其中第一種方式主要是開發階段使用,它需要主機上有CYPRESS公司提供的開發軟件USBCONTROLPANEL,每次手動將程序下載到USB上。第二種方法需要開發者另外再編寫一個固件下載驅動程序,而且也需要在電路中外加一小容量的E2PROM。第3種方法是將固件程序燒寫到E2PROM中,每次上電自動加載,這種方式簡單直接。本設計采用第3種方式。
3驅動程序及INF文件的編寫
設備驅動程序是應用程序和硬件之間的連接,應用程序通過驅動程序與設備通信,數據交換,從而獲取數據和對設備進行控制。CYPRESS公司為EZ⁃USBFX2提供一通用的驅動程序CYUSB.SYS,其功能完備,使用者不需要修改直接使用[5]。USB設備都具有一個VID和PID,此處的VID和PID與在固件程序轉載階段的值不同,這兩個值是用來安裝設備驅動程序的,VID和PID放到設備描述符表中,通過設備請求讀入到Windows系統中。同時,Win⁃dows操作系統通過INF文件將一VID和PID綁定到某一設備驅動程序。當設備連接到主機上時,讀得設備的VID和PID,通過存儲在INF文件中的信息找到設備驅動。此后,Windows會將設備的VID和PID值保存到注冊表,設備再次連接時,系統就會在注冊表中查找設備驅動程序信息。具體操作方法是將驅動安裝的模板INF文件的MODEL節中的VID與PID值修改成與USB設備的VID和PID值相同。相應STRING節中也修改。
4與應用程序的接口
圖3是驅動程序流程圖,從圖中可以看到功能驅動程序的位置。用戶通過一種規范的方式調用WIN32API函數來訪問硬件,不用考慮如何控制硬件的具體細節。USB開發過程主要應知道應用程序調用驅動程序的接口函數,如下介紹,應用程序直接調用這些函數來實現與硬件設備的數據交換。CREATEFILE通過設備名打開設備,獲得設備句柄,有設備句柄就可以讀寫設備。通過下面語句獲得設備句柄。DEVICEIOCONTROL讀寫控制設備,應用程序調用此函數并加以不同的I/O控制碼參數,完成應用程序與驅動程序將的數據交換。主要用到的I/O控制碼有:IOCTL_EZUSB_BULK_READ該控制碼從指定的批量管道中讀取數據。讀操作阻塞調用進程,直到數據傳送完成。IOCTL_EZUSB_BULK_WRITE該控制碼向指定的批量管道中寫入數據。寫操作阻塞調用進程,直到數據傳送完成。CLOSEHANDLE通過句柄關閉設備,設備請求完成后通過此函數關閉。
5結語