新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Lua腳本語(yǔ)言的嵌入式UART通信的實(shí)現(xiàn)

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

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

  3.3 調(diào)用Lua函數(shù)設(shè)置發(fā)送緩沖區(qū)

  為通過Lua腳本對(duì)串口發(fā)送緩沖區(qū)進(jìn)行設(shè)置,在腳本中定義了如下函數(shù):

  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

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

圖5 函數(shù)調(diào)用時(shí)的虛擬棧示例

  從而在C程序中,只需要調(diào)用下面語(yǔ)句即可將該串口發(fā)送緩沖區(qū)中索引為1的內(nèi)存區(qū)域設(shè)置成0x22:

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

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

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

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

  當(dāng)在C程序中需對(duì)串口發(fā)送緩沖區(qū)進(jìn)行設(shè)置時(shí),將按如下方法調(diào)用該腳本函數(shù):

  lua_getglobal(L, “uart_p0_set_txBuf ”);

  lua_pcall(L, 0, 1, 0);

  其中,函數(shù)lua_getglobal的參數(shù)“uart_p0_set_txBuf”為要調(diào)用的腳本函數(shù)名,函數(shù)lua_pcall的函數(shù)原型為:

  int (lua_pcall) (

  lua_State *L,

  int nargs, //調(diào)用函數(shù)的參數(shù)個(gè)數(shù)

  int nresults, //返回的參數(shù)個(gè)數(shù)

int errfunc //錯(cuò)誤處理函數(shù)號(hào)

  );

  因所調(diào)用的腳本函數(shù)uart_p0_set_txBuf沒有參數(shù),有一個(gè)返回值,所以分別將nargs、nresults置為0、1,而錯(cuò)誤處理函數(shù)暫不使用,故置為0.

  對(duì)于腳本中的返回值,將在腳本函數(shù)調(diào)用結(jié)束時(shí),置于lua_pcall調(diào)用環(huán)境所在的虛擬棧的棧頂中,可由C程序根據(jù)索引取出。

  經(jīng)以上過程,就完成了對(duì)串口發(fā)送緩沖區(qū)的內(nèi)容設(shè)置,然后就可以通過串口芯片的驅(qū)動(dòng)程序?qū)⑵浒l(fā)送到外圍設(shè)備。

  在現(xiàn)場(chǎng)應(yīng)用時(shí),只需根據(jù)不同外圍設(shè)備問詢報(bào)文的要求來(lái)修改腳本中data數(shù)組以及p0_send_num變量的內(nèi)容即可,而不用對(duì)裝置的C程序進(jìn)行任何修改。

  3.4 通過Lua函數(shù)處理接收緩沖區(qū)數(shù)據(jù)

  通過Lua和C的交互來(lái)對(duì)串口接收緩沖區(qū)數(shù)據(jù)的處理方法同發(fā)送緩沖區(qū)的處理基本相似。

  當(dāng)裝置通過串口驅(qū)動(dòng)程序?qū)⑼鈬O(shè)備發(fā)來(lái)的數(shù)據(jù)置入接收緩沖區(qū)后,在C函數(shù)中調(diào)用腳本函數(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ù)中,可通過調(diào)用注冊(cè)的C函數(shù)get_rx_buf來(lái)獲取接收緩沖區(qū)中的內(nèi)容:

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

  其中,data為腳本中類似于數(shù)組的表類型。port為串口芯片的端口號(hào),index為緩沖區(qū)的索引號(hào),在C程序中通過以下語(yǔ)句對(duì)腳本返回所取數(shù)據(jù)值:

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

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

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

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

  可以看出,在腳本中也是借助于虛擬棧來(lái)獲取C程序的返回值。通過以上方法成功獲取了串口接收緩存區(qū)的內(nèi)容后,就可根據(jù)具體的外圍設(shè)備在腳本中對(duì)其接收數(shù)據(jù)的正確性進(jìn)行判斷,如果判斷結(jié)果正確,則調(diào)用前面注冊(cè)的C函數(shù)uart_ok_del進(jìn)行相關(guān)業(yè)務(wù)處理。

  ied. uart_ok_del (port)

  結(jié)語(yǔ)

  從本文提供的方案可以看出,從始至終,IED裝置的C語(yǔ)言應(yīng)用程序在Lua虛擬機(jī)與外圍設(shè)備之間,除了報(bào)文的透明傳輸功能外,并不負(fù)責(zé)具體數(shù)據(jù)業(yè)務(wù)的處理,這就使在C程序的設(shè)計(jì)中完全不需要考慮外圍設(shè)備所采用的串口通信數(shù)據(jù)格式,具體的數(shù)據(jù)內(nèi)容都可放在腳本文件中進(jìn)行設(shè)置和處理。在現(xiàn)場(chǎng)應(yīng)用中,就可以達(dá)到僅修改Lua腳本文件就能完成IED裝置與不同的串口通信外圍設(shè)備之間的數(shù)據(jù)交互功能,從而實(shí)現(xiàn)對(duì)裝置串口通信規(guī)約的現(xiàn)場(chǎng)可配置化。

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

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


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


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

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

關(guān)鍵詞: Lua腳本語(yǔ)言 嵌入式 UART通信

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉