新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Lua腳本語言的嵌入式UART通信的實現

        基于Lua腳本語言的嵌入式UART通信的實現

        作者: 時間:2013-10-15 來源:網絡 收藏

          引言

          隨著變電站智能化程度的逐步提高,對溫度、濕度等現場狀態參量的采集需求也越來越多。就目前而言,在現場應用中,此類設備多采用RS232或RS485等UART串行通信方式和IED(Intelligent Electronic Device,智能電子設備)裝置進行交互。一般來說,不同的設備采用的通信數據幀格式并不相同。各式各樣的串口數據幀格式,對IED裝置的軟件定型造成一定的困難。傳統的做法一般是由裝置生產廠家指定和其配套的外圍設備,裝置的靈活性不夠理想。本文針對此類問題,提出了一種基于的解決方案,可有效地提高IED裝置對各種類型串口數據報文幀格式的適應性。該方案將具體串口報文規約的組建和解析交給Lua腳本進行處理,從而使設計者在裝置的軟件開發中,可僅關注于相關接口的設計,而不用關心具體的串口通信規約,從而方便軟件的定型,并提高了裝置自身在應用中的靈活性。

          1 介紹

          Lua是一種源碼開放的、免費的、輕量級的腳本語言,源碼完全采用ANSI(ISO) C.這一點使它非常適合融入目前以C語言為主的開發環境之中。兩者之間實現交互的關鍵在于一個虛擬的棧,通過該虛擬棧和Lua提供的可對該棧進行操作的相關接口函數,可以很方便地在它們之間實現各種類型數據的傳遞。

          與其他腳本語言(如Perl、Tcl、Python等)相比,Lua表現出了足夠的簡單性以及非常高的執行效率,結合其與平臺的高度無關以及充分的可擴展性[1],這使得它越來越多地得到大家的關注。因此,在本文的方案中優先選用Lua腳本來進行設計。

          2 系統方案概述

          本方案主要是圍繞著IED裝置和外圍串口設備之間的通信來進行設計的,系統框架如圖1所示。

        圖1 系統框架

          當IED裝置開始運行時,將創建一個用于的讀寫調度任務。在該任務中,首先通過Lua提供的接口函數來啟動其腳本引擎,并創建Lua虛擬機。然后即可將用戶編寫的C函數注冊到Lua虛擬機中去,并將存在于Flash文件系統中獨立于裝置C程序的Lua腳本文件加載到虛擬機中,從而建立起Lua和C的交互環境。在系統應用中,將需要發送到外圍設備的具體數據內容都放在Lua腳本文件中。當裝置C程序需要發送數據時,通過通信讀寫調度程序及虛擬機的配合,將這部分數據取出,并調用串口驅動程序發送給外圍設備。當收到外圍設備發給IED裝置的報文時,再將相應數據傳給虛擬機中運行的腳本程序進行處理,并由Lua根據數據處理結果來調用已注冊的C函數進行相關業務處理。

        圖2 系統程序流程

          本系統的程序流程如圖2所示。

          其中,串口通信芯片采用TI公司的帶64字節FIFO的4通道可編程UART芯片TL16C754B來實現。它的4個通道可分別獨立編程,在3.3 V的操作電壓下,數據傳輸速率可高達2 Mbps,適合多種環境中的應用[2]。基于裝置的應用環境,本文采用RS485的問答機制并結合查詢方式來對該串口通信方案進行設計。在方案實現中,裝置將每隔一定時間通過串口芯片發送一次查詢報文,當查詢到外圍設備發送的正確響應報文后,再進行相關業務處理。

          3 功能實現

          在應用領域,串口通信的應用比較成熟,因此,本文將著重介紹Lua是如何服務于這一應用的。從圖2可以看出,Lua的使用主要體現在如下幾個方面:

          ◆ Lua與C交互環境的建立;

          ◆ 提取腳本中的串口配置數據;

          ◆ 調用Lua函數設置發送緩沖區;

          ◆ 通過Lua函數處理接收緩沖區數據。

        3.1 Lua與C交互環境的建立

          要建立交互環境,首先要啟動Lua腳本引擎,并創建虛擬機。其機制雖然相對復雜,但對應用來說卻比較簡單,通過“L=lua_open(NULL);”即可實現。其中,L是一個指向結構類型為lua_State的指針變量,該結構將負責對Lua的運行狀態進行維護。

          為了實現Lua腳本函數對系統程序中串口發送和接收緩存區的數據進行訪問,定義了幾個C函數供腳本調用,即用于設置串口發送緩沖區的函數set_tx_buf、讀取串口接收緩沖區的函數get_rx_buf,以及在Lua腳本中判斷串口數據交互正常時調用的結果處理函數uart_ok_del.

          在Lua腳本中,要成功調用以上函數,必須將其加載到Lua虛擬機中去,本文采用Lua提供的一種注冊C函數庫的方法來實現。具體加載過程如下:

          ① 按以下格式定義調用函數:

          static int set_tx_buf(lua_State *L);

          static int get_rx_buf(lua_State *L);

          static int uart_ok_del(lua_State *L);

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        c語言相關文章:c語言教程


        通信相關文章:通信原理


        土壤濕度傳感器相關文章:土壤濕度傳感器原理

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 福海县| 忻城县| 常熟市| 修武县| 溧水县| 壤塘县| 禄劝| 隆昌县| 永年县| 安庆市| 休宁县| 清丰县| 湛江市| 贵定县| 合山市| 黎川县| 舟山市| 互助| 泾阳县| 称多县| 博罗县| 宁陵县| 本溪市| 新宾| 咸宁市| 来安县| 和田县| 云霄县| 达孜县| 霍州市| 安阳县| 蒲城县| 阿城市| 香港| 荆州市| 正宁县| 扬州市| 高密市| 宜春市| 兴仁县| 都江堰市|