
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_”開頭的函數(shù)
對(duì)于多個(gè)“點(diǎn)”,它們可能使用同一個(gè)“modbus_t”。所以需要先判斷:如果已經(jīng)有了對(duì)應(yīng)的“modbus_t”,就無法再次創(chuàng)建。
以“讀點(diǎn)”為例,代碼在“modbus_client.c”里,如下:

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


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


13.4.6 實(shí)現(xiàn)Modbus TCP操作
Modbus TCP的操作跟Modbus RTU的操作時(shí)同一套代碼,在如下函數(shù)中根據(jù)port_info確定是創(chuàng)建什么類型的 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)程序開發(fā)
源碼為:

我們要解析的代碼基本都在這個(gè)文件里:
“demo_lv_modbus_tool\lv_100ask_modbus_tool\src\lv_modbus_tool.c”。

13.5.1 程序流程
LVGL前臺(tái)程序的源碼里,關(guān)鍵點(diǎn)有兩個(gè):
如何布局、創(chuàng)建各類控件
它們的回調(diào)函數(shù)
1.布局的重要概念
布局、創(chuàng)建控件時(shí),有一個(gè)“parent”的概念。可以認(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)建各類控件:

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

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讀寫傳感器。
3.main函數(shù)
main函數(shù)在“demo_lv_modbus_tool\main.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”,就開始創(chuàng)建界面了。它的代碼在“demo_lv_modbus_tool\lv_100ask_modbus_tool\src\lv_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)建出類似下面的控件:

代碼如下:

add_new_item函數(shù)是核心代碼,單獨(dú)講解。

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

最底層,表示“點(diǎn)”的整個(gè)區(qū)域,它沒有數(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ù)選框,代碼如下:

以后的操作是類似的,不再贅述。


需要產(chǎn)品及方案支持
請(qǐng)掃碼登記
如您在使用瑞薩MCU/MPU產(chǎn)品中有任何問題,可識(shí)別下方二維碼或復(fù)制網(wǎng)址到瀏覽器中打開,進(jìn)入瑞薩技術(shù)論壇尋找答案或獲取在線技術(shù)支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續(xù)
推薦閱讀
框架設(shè)計(jì) - RZ MPU工業(yè)控制教程連載(48)
LVGL相關(guān)與JSON-RPC相關(guān) - RZ MPU工業(yè)控制教程連載(49)
后臺(tái)程序開發(fā)相關(guān)操作 - RZ MPU工業(yè)控制教程連載(50)



需要產(chǎn)品及方案支持
請(qǐng)掃碼登記