色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

電子設計 ? 作者:電子設計 ? 2018-11-06 09:24 ? 次閱讀

引言

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

1 Lua腳本語言介紹

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

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

2 系統方案概述

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

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

圖1 系統框架

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

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

圖2 系統程序流程

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

其中,串口通信芯片采用TI公司的帶64字節FIFO的4通道可編程UART芯片TL16C754B來實現。它的4個通道可分別獨立編程,在3.3 V的操作電壓下,數據傳輸速率可高達2 Mbps,適合多種UART通信環境中的應用[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);

② 聲明一個結構數組,每個數組元素分別為C函數在Lua腳本中的調用名字及對應的C函數,即以"name-function"對的形式出現,如下所示:static const struct luaL_reg uartLib[] ={

{"set_tx_buf",set_tx_buf},

{"get_tx_buf", get_tx_buf},

{"uart_ok_del", uart_ok_de},

{NULL, NULL}

};

③ 調用以下函數對C函數庫進行注冊:luaL_register(L, "ied", uartLib );其中,參數L即為創建虛擬機時的函數返回值(以下同),字符串"ied"為注冊到虛擬機中的庫名稱。第3個參數uartLib即為前面聲明的結構數組,對應需要注冊的庫函數表。

通過以上步驟,即可完成Lua腳本中需要調用的3個C函數的注冊過程,從而就可以在Lua腳本中通過"庫名稱。庫函數"的形式來對其進行調用,如"ied.set_tx_buf(函數參數)".

腳本文件本身的加載則相對簡單,只需通過如下函數調用即可:

luaL_dofile(L, "uart_script.lua");

其中,參數L和以上的函數調用相同,第2個參數則為腳本文件在Flash中的具體存儲路徑。

至此,就成功建立了一個Lua與C的交互環境。

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

要正確地進行Lua和C的交互過程,首先必須對Lua和C交互時所采用虛擬棧的作用和操作有比較深入的了解。在Lua和C的交互中,它們彼此之間函數參數以及返回值都將由該棧來負責傳遞。Lua和C在棧的操作方式上稍有不同,在Lua中采用嚴格的LIFO方式,而C則還可以通過索引的方式進行。以3個參數為例,參數1首先入棧,參數2、3隨后順次入棧,Lua虛擬棧存儲結構及索引對應關系如圖3所示。

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

圖3 Lua虛擬棧結構示例圖

如需在C中訪問參數1,則既可以通過索引號1進行,也可通過索引號-3進行。其中,正索引按入棧順序從1依次遞增,負索引按出棧順序從-1依次遞減。

通常情況下,串口的配置主要有以下幾項:是否使能、數據位數、停止位數、奇偶校驗標志位和波特率。因此,在Lua腳本中,本文采用Lua的表結構對其進行設置,示例如下(本文中斜體代碼表示為Lua腳本,以下同):

uart_p0={

enable=1,--使能位

dataBits=8 , --數據位數

stopBits=1 , --停止位數

parityBit=2 , --奇偶校驗

baudRate=9600 --波特率

};

該例表示對UART芯片的P0口進行使能,并且采用8位數據位、1位停止位、偶校驗(本文定義parityBit的值取0為無校驗,取1為奇校驗,取2為偶校驗)的幀格式,波特率為9 600 bps.

在C語言中,要獲取表中enable屬性字段的值,可采用以下步驟:

① 調用接口函數并以表名稱作為參數,將該表入棧:

lua_getglobal(L, "uart_p0");

② 調用接口函數將enable屬性字段的屬性名稱入棧:

lua_pushstring(L, "enable");

③ 調用接口函數提取屬性值,該操作在C中可看作是一個先出棧再入棧的過程,結果將在②中已入棧的屬性名稱所在位置填入屬性值:

lua_gettable(L, -2);

其中,參數"-2"為棧中的索引號。

④ 調用接口函數取出棧頂中該屬性字段的值,并調用出棧函數,以恢復調用環境:

p0_enable = (int)lua_tonumber(L, -1);

lua_pop(L, 1);

其中,lua_tonumber函數的參數"-1"也為棧中的索引號,該操作將取出棧頂元素的數值,鑒于Lua中的數據都為浮點數,所以需將其強制轉換為整型數據。lua_pop中參數"1"為非索引,僅說明從棧頂將1個元素出棧。

通過以上操作,就可以正確地取出腳本中p0口參數設置表中enable屬性字段的值。其他屬性字段的提取與其相同。虛擬棧中的內容變化如圖4所示。

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

圖4 提取表中屬性值時的虛擬棧操作示意圖

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

為通過Lua腳本對串口發送緩沖區進行設置,在腳本中定義了如下函數:

data ={0x11, 0x22, 0x33, 0x44, 0x55 };

function uart_p0_set_txBuf()

local port=0;

local p0_send_num=5;

for i=1, p0_send_num do

ied.set_tx_buf(port,i-1, data[i])

end

return p0_send_num

end

從腳本內容可以看出,在此采用了一個Lua中的循環結構對發送緩沖區進行設置,并返回設置的數據個數。其中,全局變量data是Lua腳本中的表,類似于數組,在此表示需要設置的緩沖區內容;ied.set_tx_buf()為在3.1節中提到的已注冊到虛擬機中的C函數庫中的一個函數。其參數port表示端口號,i-1表示緩沖區索引號,data[i]表示具體的數據內容。在應用中需要注意的是,在Lua中,數組索引默認從1開始,而不像C中從0開始。另外,在C中定義set_tx_buf函數時并未設置參數,這主要是因為參數的提取必須借助于虛擬棧才能實現。在腳本中調用時,對其參數將按照從左到右的順序依次入棧,在C中要取出參數時,按照其在棧中相應的索引號取出即可。在Lua中對每個函數的調用都有一個獨立的棧,因此,若以i取2時調用情況為例,在C函數set_tx_buf中看到的棧內容將如圖5所示。

Lua腳本語言介紹與如何實現嵌入式UART通信設計方案

圖5 函數調用時的虛擬棧示例

從而在C程序中,只需要調用下面語句即可將該串口發送緩沖區中索引為1的內存區域設置成0x22:

port=(int)lua_tonumber(L,1);//取端口號

index=(int)lua_tonumber(L,2);//取索引

data=(char)lua_tonumber(L,3);//取數據

uart_port_tx_buf[port].data[index]=data;

當在C程序中需對串口發送緩沖區進行設置時,將按如下方法調用該腳本函數:

lua_getglobal(L, "uart_p0_set_txBuf ");

lua_pcall(L, 0, 1, 0);

其中,函數lua_getglobal的參數"uart_p0_set_txBuf"為要調用的腳本函數名,函數lua_pcall的函數原型為:

int (lua_pcall) (

lua_State *L,

int nargs, //調用函數的參數個數

int nresults, //返回的參數個數

int errfunc //錯誤處理函數號

);

因所調用的腳本函數uart_p0_set_txBuf沒有參數,有一個返回值,所以分別將nargs、nresults置為0、1,而錯誤處理函數暫不使用,故置為0.

對于腳本中的返回值,將在腳本函數調用結束時,置于lua_pcall調用環境所在的虛擬棧的棧頂中,可由C程序根據索引取出。

經以上過程,就完成了對串口發送緩沖區的內容設置,然后就可以通過串口芯片的驅動程序將其發送到外圍設備。

在現場應用時,只需根據不同外圍設備問詢報文的要求來修改腳本中data數組以及p0_send_num變量的內容即可,而不用對裝置的C程序進行任何修改。

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

通過Lua和C的交互來對串口接收緩沖區數據的處理方法同發送緩沖區的處理基本相似。

當裝置通過串口驅動程序將外圍設備發來的數據置入接收緩沖區后,在C函數中調用腳本函數:

lua_getglobal(L, "uart_p0_del_rxBuf");

lua_pushnumber(L, size);

ret=lua_pcall(L, 1, 1, 0);

其中,參數uart_p0_del_rxBuf為腳本中定義的緩沖區數據處理函數名,通過lua_pushnumber將接收數據的大小入棧,從而傳給Lua腳本函數,腳本函數的原型如下:

function uart_p0_del_rxBuf(rx_size)

在該函數中,可通過調用注冊的C函數get_rx_buf來獲取接收緩沖區中的內容:

data[i] = ied.get_rx_buf(port,index)

其中,data為腳本中類似于數組的表類型。port為串口芯片的端口號,index為緩沖區的索引號,在C程序中通過以下語句對腳本返回所取數據值:

port=(int)lua_tonumber(L,1);//取端口號

index=(int)lua_tonumber(L,2);//取索引

data=uart_port_rx_buf[port].data[index];

lua_pushnumber(L, data);//返回值入棧

可以看出,在腳本中也是借助于虛擬棧來獲取C程序的返回值。通過以上方法成功獲取了串口接收緩存區的內容后,就可根據具體的外圍設備在腳本中對其接收數據的正確性進行判斷,如果判斷結果正確,則調用前面注冊的C函數uart_ok_del進行相關業務處理。

ied. uart_ok_del (port)

結語

從本文提供的方案可以看出,從始至終,IED裝置的C語言應用程序在Lua虛擬機與外圍設備之間,除了報文的透明傳輸功能外,并不負責具體數據業務的處理,這就使在C程序的設計中完全不需要考慮外圍設備所采用的串口通信數據格式,具體的數據內容都可放在腳本文件中進行設置和處理。在現場應用中,就可以達到僅修改Lua腳本文件就能完成IED裝置與不同的串口通信外圍設備之間的數據交互功能,從而實現對裝置串口通信規約的現場可配置化。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5085

    文章

    19138

    瀏覽量

    305708
  • uart
    +關注

    關注

    22

    文章

    1237

    瀏覽量

    101446
  • 串行通信
    +關注

    關注

    4

    文章

    574

    瀏覽量

    35424
收藏 人收藏

    評論

    相關推薦

    Lua腳本簡單介紹

    Lua簡單介紹Lua[1]是一個小巧的腳本語言。作者是巴西人。該語言的設計目的是為了嵌入應用程序
    發表于 08-20 06:37

    關于Lua腳本語言

    一、關于Lua腳本語言Lua 是一個小巧的腳本語言。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一
    發表于 08-20 06:23

    Lua腳本簡單介紹

    Lua簡單介紹Lua[1]是一個小巧的腳本語言。作者是巴西人。該語言的設計目的是為了嵌入應用程序
    發表于 08-20 08:06

    嵌入式腳本語言Berry的相關資料下載

    嵌入式腳本語言 Berry github網址 :https://github.com/Skiars/berryBerry 是一款面向小型嵌入式系統的腳本語言,目前發布了 0.1.0 版
    發表于 12-23 07:18

    適用于Java的嵌入式腳本語言是什么

    /fakescript-java簡介fakescript是一款輕量級的嵌入式腳本語言,使用Java語言編寫,語法吸取自lua、golang、erlang,基于jflex、cup生成語法
    發表于 12-23 08:17

    嵌入式腳本語言Berry具有哪些特性?

    嵌入式腳本語言Berry具有哪些特性?
    發表于 12-27 07:57

    基于Lua腳本語言嵌入式UART通信方案設計

    針對變電站中采用UART串口通信規約進行信息傳遞的各種外圍設備,在需要與其進行通信的IED智能裝置的開發中,設計了一種基于Lua腳本語言
    發表于 05-10 13:44 ?3191次閱讀
    基于<b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>UART</b><b class='flag-5'>通信</b><b class='flag-5'>方案</b>設計

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

    引言 隨著變電站智能化程度的逐步提高,對溫度、濕度等現場狀態參量的采集需求也越來越多。就目前而言,在現場應用中,此類設備多采用RS232或RS485等UART串行通信方式和IED
    發表于 11-30 11:37 ?1492次閱讀
     基于<b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>UART</b><b class='flag-5'>通信</b>的<b class='flag-5'>實現</b>

    你知道在linux下搭建lua腳本語言的編程環境?

    lua腳本語言的一種,具體的該腳本介紹可百度,本文介紹Linux系統下搭建lua編程環境的步
    發表于 05-16 16:25 ?3703次閱讀
    你知道在linux下搭建<b class='flag-5'>lua</b><b class='flag-5'>腳本語言</b>的編程環境?

    基于Lua腳本語言的ESP8266 TCP服務器資料免費下載

      本文檔的主要內容詳細介紹的是基于Lua腳本語言的ESP8266 TCP服務器資料免費下載。
    發表于 06-21 17:43 ?3次下載
    基于<b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>的ESP8266 TCP服務器資料免費下載

    如何使用Lua腳本語言進行ESP8266和TCP服務器多連接

    本文檔的主要內容詳細介紹的是如何使用Lua腳本語言進行ESP8266和TCP服務器多連接。
    發表于 06-10 17:48 ?2次下載
    如何使用<b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>進行ESP8266和TCP服務器多連接

    Lua腳本語言入門教程資料說明

    今天開始自己的Lua語言學習,Lua腳本語言,是介于應用程序和開發其應用程序的底層編程語言之間,,它很方便調用其它
    發表于 05-21 18:03 ?2次下載
    <b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>入門教程資料說明

    Lua腳本語言入門教程資料免費下載

      寫完這篇Lua腳本語言入門,自己就要嘗試去用Lua腳本語言寫esp8266了,,自己現在挺心急的,因為朋友使用esp8266本來說自己幫忙寫好程序的,但是用的單片機不一樣自己沒有,
    發表于 05-10 18:13 ?5次下載
    <b class='flag-5'>Lua</b><b class='flag-5'>腳本語言</b>入門教程資料免費下載

    深入LUA腳本語言

    由于gdb的代碼相對復雜,沒有辦法從代碼層面仔細的分析調試細節,所以這次我們選擇一個小巧、開源的Lua腳本語言,深入到最底層的代碼中去探究一下代碼調試真正是怎么一回事。
    的頭像 發表于 02-14 13:55 ?899次閱讀
    深入<b class='flag-5'>LUA</b><b class='flag-5'>腳本語言</b>

    【串口屏LUA教程】Lua腳本語言中文教程

    【串口屏LUA教程】Lua腳本語言中文教程
    發表于 04-29 13:03 ?27次下載
    主站蜘蛛池模板: 亚洲三级黄色| 久久久久久88色偷偷| 国内久久久久影院精品| 欧美九十老太另类| 伊人久久综合影院| 后入内射国产一区二区| 午夜在线观看免费完整直播网页| CHINA学生白嫩| 蜜芽国产在线精品欧美| 最近最新的日本字幕MV| 久久久午夜精品福利内容| 亚洲无吗精品AV九九久久| 国产最新进精品视频| 亚洲.日韩.欧美另类| 国模精品一区二区三区视频| 午夜在线播放免费人成无| 国产伦精品一区二区三区免费观看| 色色激情网| 国产成人免费| 忘忧草研究所 麻豆| 国产精品亚洲电影久久成人影院| 天天啪免费视频在线看| 国产AV亚洲一区精午夜麻豆| 神马影院午夜伦理限级| 国产精品嫩草久久久久| 亚洲乱码日产精品BD在线下载| 精品九九视频| 2020久久精品永久免费| 男人把女人桶到爽免费看视频| sao虎影院桃红视频在线观看| 日本久久道一区二区三区| 公开超碰在线视频| 亚洲精品视频在线播放| 辣文肉高h粗暴| SM脚奴调教丨踩踏贱奴| 忘忧草在线影院WWW日本动漫| 黑人强伦姧人妻日韩那庞大的| 孕妇高潮抽搐喷水30分钟| 女人精69xxxxx舒心| 俄罗斯兽交XXXXX在线| 午夜理论电影在线观看亚洲|