13.4.4 實(shí)現(xiàn)Modbus RTU讀操作
要使用libmodbus操作Modbus RTU傳感器,需要做的事情有2個(gè):
創(chuàng)建modbus_t:調(diào)用“modbus_new_rtu”、“modbus_connect”
調(diào)用“modbus_read_”、“modbus_write_”開(kāi)頭的函數(shù)
對(duì)于多個(gè)“點(diǎn)”,它們可能使用同一個(gè)“modbus_t”。所以需要先判斷:如果已經(jīng)有了對(duì)應(yīng)的“modbus_t”,就無(wú)法再次創(chuàng)建。
以“讀點(diǎn)”為例,代碼在“modbus_client.c”里,如下:

其中“get_modbus_ctx”函數(shù)如下:

13.4.5 實(shí)現(xiàn)Modbus RTU寫(xiě)操作
代碼在“modbus_client.c”里,如下:

13.4.6 實(shí)現(xiàn)Modbus TCP操作
Modbus TCP的操作跟Modbus RTU的操作時(shí)同一套代碼,在如下函數(shù)中根據(jù)port_info確定是創(chuàng)建什么類(lèi)型的 modbus_t結(jié)構(gòu)體:

13.4.7 實(shí)現(xiàn)OTA升級(jí)
傳感器升級(jí)設(shè)計(jì)各個(gè)傳感器內(nèi)部的實(shí)現(xiàn),后臺(tái)程序(控制中心)只是給出了接口。
前臺(tái)程序在如下界面中,把如下信息:固件文件名、設(shè)置的端口信息、升級(jí)哪個(gè)設(shè)備,發(fā)送給后臺(tái)程序(控制中心):

發(fā)送的信息存為如下結(jié)構(gòu)體:

然后使用如下函數(shù)發(fā)起RPC調(diào)用:

后臺(tái)程序(控制中心)對(duì)應(yīng)的代碼如下:

在實(shí)現(xiàn)真正的傳感器升級(jí)時(shí),前臺(tái)程序要知道升級(jí)進(jìn)度,它可以調(diào)用如下函數(shù)發(fā)出RPC請(qǐng)求:

后臺(tái)程序(控制中心)對(duì)應(yīng)的代碼如下:

13.5 LVGL前臺(tái)程序開(kāi)發(fā)
源碼為:

我們要解析的代碼基本都在這個(gè)文件里:
“demo_lv_modbus_toollv_100ask_modbus_toolsrclv_modbus_tool.c”。
13.5.1 程序流程
LVGL前臺(tái)程序的源碼里,關(guān)鍵點(diǎn)有兩個(gè):
如何布局、創(chuàng)建各類(lèi)控件
它們的回調(diào)函數(shù)
1.布局的重要概念
布局、創(chuàng)建控件時(shí),有一個(gè)“parent”的概念??梢哉J(rèn)為“parent”是一個(gè)“容器”,在上面可以繼續(xù)創(chuàng)建各個(gè)控件。
比如下圖中,控件1對(duì)應(yīng)綠色背景的區(qū)域,控件2對(duì)應(yīng)大紅框的區(qū)域,控件1、控件2都是在同一個(gè)“parent”上創(chuàng)建處理的。這個(gè)“parent”是整個(gè)屏幕區(qū)域。

對(duì)于控件1,它也可以作為“parent”,在它上面有可以繼續(xù)創(chuàng)建按鈕:“+”按鈕、“Upgrade”按鈕、“MQTT Setting”按鈕:

對(duì)于控件2,它也可以作為“parent”,在它上面有可以繼續(xù)創(chuàng)建各類(lèi)控件:

表示一個(gè)點(diǎn)時(shí),界面如下。它本身又可以作為一個(gè) parent,在里面繼續(xù)繪制各類(lèi)控件:

2.控件的回調(diào)函數(shù)
當(dāng)我們點(diǎn)擊某個(gè)按鈕時(shí),會(huì)有對(duì)應(yīng)的函數(shù)被調(diào)用,這就是它的回調(diào)函數(shù)。在回調(diào)函數(shù)里,我們可以彈出對(duì)話框,可以使用RPC讀寫(xiě)傳感器。
3.main函數(shù)
main函數(shù)在“demo_lv_modbus_toolmain.c”中,代碼如下:

13.5.2 使用屏幕和鼠標(biāo)
LVGL對(duì)基于Framebuffer的屏幕、鼠標(biāo)的支持很完善,只需要提供設(shè)備節(jié)點(diǎn)即可。代碼如下:

13.5.3 創(chuàng)建初始界面
main函數(shù)里調(diào)用“l(fā)v_modbus_tool”,就開(kāi)始創(chuàng)建界面了。它的代碼在“demo_lv_modbus_toollv_100ask_modbus_toolsrclv_modbus_tool.c”中。
1.第1個(gè)區(qū)域的創(chuàng)建
第1個(gè)區(qū)域指:

第1步:以整個(gè)屏幕為parent,創(chuàng)建出控件1。
第2步:以控件1為parent,創(chuàng)建出左邊的3個(gè)控件。
代碼如下:

2.第2個(gè)區(qū)域的創(chuàng)建
第2個(gè)區(qū)域指:

代碼如下:

3.“點(diǎn)”的創(chuàng)建
LVGL前臺(tái)程序運(yùn)行時(shí),會(huì)使用RPC調(diào)用獲得點(diǎn)的信息。對(duì)于每個(gè)點(diǎn),都會(huì)創(chuàng)建出類(lèi)似下面的控件:

代碼如下:

add_new_item函數(shù)是核心代碼,單獨(dú)講解。
13.5.4 add_new_item函數(shù)解析
1.代碼里層級(jí)的注釋
add_new_item函數(shù)里,創(chuàng)建了多層控件。在代碼的注釋里,怎么體現(xiàn)這些一層又一層的嵌套關(guān)系呢?使用類(lèi)似“[0]、[1]”表示第1層,使用“[1-0]、[1-1]”表示第2層。
在使用“add_new_item”函數(shù)創(chuàng)建如下控件時(shí),理解了注釋里的數(shù)字,更容易理解代碼:

最底層,表示“點(diǎn)”的整個(gè)區(qū)域,它沒(méi)有數(shù)字注釋。比如下面的cont2_x,它對(duì)應(yīng)下圖紅框的區(qū)域(忽略里面的內(nèi)容):

cont2_x作為parent,作為底層,在上面創(chuàng)建了4個(gè)“child”。這些“child”的代碼注釋是“[0]、[1]、[2]、[3]”,如下:
“[0]”對(duì)應(yīng)的控件:

“[1]”對(duì)應(yīng)的控件:

“[1-0]”對(duì)應(yīng)的控件:

2.代碼分析
add_new_item函數(shù)非常龐大,把源碼和圖案進(jìn)行對(duì)比,才容易理解。
第1步,劃分區(qū)域得到cont2_x,如下:

第2步,在cont2_x里繼續(xù)劃分,得到cont2_x_1,如下:

第3步,在cont2_x_1里添加按鈕、復(fù)選框,代碼如下:

以后的操作是類(lèi)似的,不再贅述。
-
傳感器
+關(guān)注
關(guān)注
2576文章
55032瀏覽量
791252 -
MODBUS
+關(guān)注
關(guān)注
28文章
2457瀏覽量
83193 -
程序開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
30瀏覽量
10942 -
LibModbus
+關(guān)注
關(guān)注
0文章
10瀏覽量
7628 -
LVGL
+關(guān)注
關(guān)注
2文章
124瀏覽量
4555
發(fā)布評(píng)論請(qǐng)先 登錄
HMI-Board開(kāi)發(fā)板工程在添加新組件時(shí)LVGL組件會(huì)報(bào)錯(cuò)的解決辦法
LVGL開(kāi)發(fā)入門(mén)教程
前臺(tái)運(yùn)行和后臺(tái)運(yùn)行二者有何區(qū)別
LVGL的字體相關(guān)資料分享
開(kāi)源輕量級(jí)顯示框架LVGL簡(jiǎn)介
開(kāi)源輕量級(jí)顯示框架LVGL簡(jiǎn)介
Purple Pi R1 LVGL使?參考
全面解讀目前LVGL的應(yīng)用小知識(shí)
LVGL 優(yōu)化幀率技巧
【飛凌OKA40i-C開(kāi)發(fā)板試用體驗(yàn)】LVGL移植與測(cè)評(píng)
如何在MDK中部署LVGL
LVGL開(kāi)發(fā)指南介紹
LVGL前臺(tái)程序開(kāi)發(fā)相關(guān)操作介紹
RK3506開(kāi)發(fā)板2秒啟動(dòng)LVGL顯示方案
LVGL前臺(tái)程序開(kāi)發(fā)相關(guān)操作
評(píng)論