<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Lua腳本語(yǔ)言的嵌入式UART通信的實(shí)現

基于Lua腳本語(yǔ)言的嵌入式UART通信的實(shí)現

作者: 時(shí)間:2013-10-15 來(lái)源:網(wǎng)絡(luò ) 收藏

  引言

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

  1 介紹

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

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

  2 系統方案概述

  本方案主要是圍繞著(zhù)IED裝置和外圍串口設備之間的通信來(lái)進(jìn)行設計的,系統框架如圖1所示。

圖1 系統框架

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

圖2 系統程序流程

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

  其中,串口通信芯片采用TI公司的帶64字節FIFO的4通道可編程UART芯片TL16C754B來(lái)實(shí)現。它的4個(gè)通道可分別獨立編程,在3.3 V的操作電壓下,數據傳輸速率可高達2 Mbps,適合多種環(huán)境中的應用[2]?;谘b置的應用環(huán)境,本文采用RS485的問(wèn)答機制并結合查詢(xún)方式來(lái)對該串口通信方案進(jìn)行設計。在方案實(shí)現中,裝置將每隔一定時(shí)間通過(guò)串口芯片發(fā)送一次查詢(xún)報文,當查詢(xún)到外圍設備發(fā)送的正確響應報文后,再進(jìn)行相關(guān)業(yè)務(wù)處理。

  3 功能實(shí)現

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

  ◆ Lua與C交互環(huán)境的建立;

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

  ◆ 調用Lua函數設置發(fā)送緩沖區;

  ◆ 通過(guò)Lua函數處理接收緩沖區數據。

3.1 Lua與C交互環(huán)境的建立

  要建立交互環(huán)境,首先要啟動(dòng)Lua腳本引擎,并創(chuàng )建虛擬機。其機制雖然相對復雜,但對應用來(lái)說(shuō)卻比較簡(jiǎn)單,通過(guò)“L=lua_open(NULL);”即可實(shí)現。其中,L是一個(gè)指向結構類(lèi)型為lua_State的指針變量,該結構將負責對Lua的運行狀態(tài)進(jìn)行維護。

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

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

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

  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操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


通信相關(guān)文章:通信原理


土壤濕度傳感器相關(guān)文章:土壤濕度傳感器原理

上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>