色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 手機(jī)與無(wú)線(xiàn)通信 > 設(shè)計(jì)應(yīng)用 > 基于Lua腳本語(yǔ)言的嵌入式UART通信方案設(shè)計(jì)

          基于Lua腳本語(yǔ)言的嵌入式UART通信方案設(shè)計(jì)

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

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

          3 功能實(shí)現(xiàn)
          應(yīng)用領(lǐng)域,串口通信的應(yīng)用比較成熟,因此,本文將著重介紹是如何服務(wù)于這一應(yīng)用的。從圖2可以看出,的使用主要體現(xiàn)在如下幾個(gè)方面:
          與C交互環(huán)境的建立;
          ◆提取中的串口配置數(shù)據(jù);
          ◆調(diào)用Lua函數(shù)設(shè)置發(fā)送緩沖區(qū);
          ◆通過(guò)Lua函數(shù)處理接收緩沖區(qū)數(shù)據(jù)。
          3.1 Lua與C交互環(huán)境的建立
          要建立交互環(huán)境,首先要啟動(dòng)Lua引擎,并創(chuàng)建虛擬機(jī)。其機(jī)制雖然相對(duì)復(fù)雜,但對(duì)應(yīng)用來(lái)說(shuō)卻比較簡(jiǎn)單,通過(guò)“L=lua_opcn(NUL L);”即可實(shí)現(xiàn)。其中,L是一個(gè)指向結(jié)構(gòu)類(lèi)型為lua_State的指針變量,該結(jié)構(gòu)將負(fù)責(zé)對(duì)Lua的運(yùn)行狀態(tài)進(jìn)行維護(hù)。
          為了實(shí)現(xiàn)Lua函數(shù)對(duì)系統(tǒng)程序中串口發(fā)送和接收緩存區(qū)的數(shù)據(jù)進(jìn)行訪(fǎng)問(wèn),定義了幾個(gè)C函數(shù)供腳本調(diào)用,即用于設(shè)置串口發(fā)送緩沖區(qū)的函數(shù)set_tx_buf、讀取串口接收緩沖區(qū)的函數(shù)get_rx_buf,以及在Lua腳本中判斷串口數(shù)據(jù)交互正常時(shí)調(diào)用的結(jié)果處理函數(shù)uart_ok_del。
          在Lua腳本中,要成功調(diào)用以上函數(shù),必須將其加載到Lua虛擬機(jī)中去,本文采用Lua提供的一種注冊(cè)C函數(shù)庫(kù)的方法來(lái)實(shí)現(xiàn)。具體加載過(guò)程如下:
          ①按以下格式定義調(diào)用函數(shù):
          static int set tx buf(lua State *L);
          static int get rx_buf(lua State *L);
          static int uart_ok_del(lua State*L);
          ②聲明一個(gè)結(jié)構(gòu)數(shù)組,每個(gè)數(shù)組元素分別為C函數(shù)在Lua腳本中的淵用名字及對(duì)應(yīng)的C函數(shù),即以“namefunction”對(duì)的形式出現(xiàn),如下所示:
          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}
          };
          ③調(diào)用以下函數(shù)對(duì)C函數(shù)庫(kù)進(jìn)行注冊(cè):
          luaL register(L.“ied”,uartLib);
          其中,參數(shù)L即為創(chuàng)建虛擬機(jī)時(shí)的函數(shù)返回值(以下同),字符串“ied”為注冊(cè)到虛擬機(jī)中的庫(kù)名稱(chēng)。第3個(gè)參數(shù)uartLib即為前面聲明的結(jié)構(gòu)數(shù)組,對(duì)應(yīng)需要注冊(cè)的庫(kù)函數(shù)表。
          通過(guò)以上步驟,即可完成Lua腳本中需要調(diào)用的3個(gè)C函數(shù)的注冊(cè)過(guò)程,從而就可以在Lua腳本中通過(guò)“庫(kù)名稱(chēng),庫(kù)函數(shù)”的形式來(lái)對(duì)其進(jìn)行調(diào)用,如“ied.set_tx_buf(函數(shù)參數(shù))”。
          腳本文件本身的加載則相對(duì)簡(jiǎn)單,只需通過(guò)如下函數(shù)調(diào)用即可:
          luaL_dofile(L,“uart script.lua”);
          其中,參數(shù)L和以上的函數(shù)調(diào)用相同,第2個(gè)參數(shù)則為腳本文件在Flash中的具體存儲(chǔ)路徑。
          至此,就成功建立了一個(gè)Lua與C的交互環(huán)境。
          3.2 提取腳本中的串口配置數(shù)據(jù)
          要正確地進(jìn)行Lua和C的交互過(guò)程,首先必須對(duì)Lua和C交互時(shí)所采用虛擬棧的作用和操作有比較深入的了解。在Lua和C的交互中,它們彼此之間函數(shù)參數(shù)以及返回值都將由該棧來(lái)負(fù)責(zé)傳遞。Lua和C在棧的操作方式上稍有不同,在Lua中采用嚴(yán)格的LIFO方式,而C則還可以通過(guò)索引的方式進(jìn)行。以3個(gè)參數(shù)為例,參數(shù)1首先入棧,參數(shù)2、3隨后順次入棧,Lua虛擬棧存儲(chǔ)結(jié)構(gòu)及索引對(duì)應(yīng)關(guān)系如圖3所示。

          本文引用地址:http://cafeforensic.com/article/155041.htm

          e.JPG

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


          評(píng)論


          相關(guān)推薦

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

          關(guān)閉