新聞中心

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

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

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

          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所示。

        圖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裝置與不同的串口通信外圍設備之間的數據交互功能,從而實現對裝置串口通信規約的現場可配置化。

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

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


        通信相關文章:通信原理


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

        上一頁 1 2 3 下一頁

        關鍵詞: Lua腳本語言 嵌入式 UART通信

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 防城港市| 贞丰县| 广西| 伊通| 蛟河市| 锡林浩特市| 昂仁县| 龙口市| 贡觉县| 太白县| 宿迁市| 长岭县| 池州市| 上虞市| 怀远县| 新邵县| 休宁县| 满城县| 安国市| 红河县| 兴业县| 周口市| 颍上县| 顺平县| 汉阴县| 新余市| 卓资县| 阳东县| 历史| 墨脱县| 昌乐县| 文山县| 赣榆县| 内江市| 莎车县| 邯郸市| 南京市| 凤阳县| 老河口市| 贡觉县| 城口县|