基于Lua腳本語言的嵌入式UART通信方案設計
從腳本內容可以看出,在此采用了一個Lua中的循環(huán)結構對發(fā)送緩沖區(qū)進行沒置,并返回設置的數(shù)據(jù)個數(shù)。其中,全局變量data是Lua腳本巾的表,類似于數(shù)組,在此表示需要設置的緩沖區(qū)內容;ied.set_tx_buf()為在3.1節(jié)中提到的已注冊到虛擬機中的C函數(shù)庫中的一個函數(shù)。其參數(shù)port表示端口號,i-1表示緩沖區(qū)索引號,data[i]表示具體的數(shù)據(jù)內容。在應用中需要注意的是,在Lua中,數(shù)組索引默認從1開始,而不像C中從0開始。另外,在C中定義set_tx_buf函數(shù)時并未設置參數(shù),這主要是因為參數(shù)的提取必須借助于虛擬棧才能實現(xiàn)。在腳本中調用時,對其參數(shù)將按照從左到右的順序依次入棧,在C中要取出參數(shù)時,按照其在棧中相應的索引號取出即可。存Lua中對每個函數(shù)的調用都有一個獨立的棧,因此,若以i取2時調用情況為例,在C函數(shù)set_tx_buf中看到的棧內容將如圖5所示。本文引用地址:http://butianyuan.cn/article/155041.htm
從而在C程序中,只需要調用下面語句即可將該串口發(fā)送緩沖區(qū)中索引為1的內存區(qū)域沒置成0x22:
當在C程序中需對串口發(fā)送緩沖區(qū)進行設置時,將按如下方法調用該腳本函數(shù):
lua_getglobal(L,“uart_p0_set_txBuf”);
lua pcall(L,0.1,0);
其中,函數(shù)lua_getglobal的參數(shù)“uart_p0_set_txBuf”為要調用的腳本函數(shù)名,函數(shù)lua_pcall的函數(shù)原型為:
因所調用的腳本函數(shù)uart_p0_set_txBuf沒有參數(shù),有一個返回值,所以分別將nargs、nresults置為0、1,而錯誤處理函數(shù)暫不使用,故置為0。
對于腳本中的返回值,將在腳本函數(shù)調用結束時,置于lua_pcall調用環(huán)境所在的虛擬棧的棧頂中,可由C程序根據(jù)索引取出。
經(jīng)以上過程,就完成了對串口發(fā)送緩沖區(qū)的內容設置,然后就可以通過串口芯片的驅動程序將其發(fā)送到外圍設備。
在現(xiàn)場應用時,只需根據(jù)不同外圍設備問詢報文的要求來修改腳本中data數(shù)組以及p0_send_num變量的內容即可,而不用對裝置的C程序進行任何修改。
3.4 通過Lua函數(shù)處理接收緩沖區(qū)數(shù)據(jù)
通過Lua和C的交互來對串口接收緩沖區(qū)數(shù)據(jù)的處理方法同發(fā)送緩沖區(qū)的處理基本相似。
當裝置通過串口驅動程序將外圍設備發(fā)來的數(shù)據(jù)置入接收緩沖區(qū)后,在C函數(shù)中調用腳本函數(shù):
lua_getglobal(L,“uart p0_del_rxBuf”);
lua pushnumber(L,size);
ret=lua_pcall(L,1.1,0);
其中,參數(shù)uart_p0_del_rxBuf為腳本中定義的緩沖區(qū)數(shù)據(jù)處理函數(shù)名,通過lua_pushnumber將接收數(shù)據(jù)的大小入棧,從而傳給Lua腳本函數(shù),腳本函數(shù)的原型如下:
function uart_p0_del_rxBuf(rx_size)
在該函數(shù)中,可通過調用注冊的C函數(shù)get_rx_buf來獲取接收緩沖區(qū)中的內容:
data[i]=ied.get_rx_buf(port,index)
其中,data為腳本中類似于數(shù)組的表類型。port為串口芯片的端口號,index為緩沖區(qū)的索引號,在C程序中通過以下語句對腳本返回所取數(shù)據(jù)值:
可以看出,在腳本中也是借助于虛擬棧來獲取C程序的返回值。通過以上方法成功獲取了串口接收緩存區(qū)的內容后,就可根據(jù)具體的外圍設備在腳本中對其接收數(shù)據(jù)的正確性進行判斷,如果判斷結果正確,則調用前面注冊的C函數(shù)uart_ok_del進行相關業(yè)務處理。
ied.uart_ok_del(port)
結語
從本文提供的方案可以看出,從始至終,IED裝置的C語言應用程序在lua虛擬機與外圍設備之間,除了報文的透明傳輸功能外,并不負責具體數(shù)據(jù)業(yè)務的處理,這就使在C程序的設計中完全不需要考慮外圍設備所采用的串口通信數(shù)據(jù)格式,具體的數(shù)據(jù)內容都可放在腳本文件中進行沒置和處理。在現(xiàn)場應用中,就可以達到僅修改Lua腳本文件就能完成IED裝置與不同的串口通信外圍設備之間的數(shù)據(jù)交互功能,從而實現(xiàn)對裝置串口通信規(guī)約的現(xiàn)場可配置化。
評論