13.4.4 實現(xiàn)Modbus RTU讀操作
要使用libmodbus操作Modbus RTU傳感器,需要做的事情有2個:
創(chuàng)建modbus_t:調(diào)用“modbus_new_rtu”、“modbus_connect”
調(diào)用“modbus_read_”、“modbus_write_”開頭的函數(shù)
對于多個“點”,它們可能使用同一個“modbus_t”。所以需要先判斷:如果已經(jīng)有了對應的“modbus_t”,就無法再次創(chuàng)建。
以“讀點”為例,代碼在“modbus_client.c”里,如下:
其中“get_modbus_ctx”函數(shù)如下:
13.4.5 實現(xiàn)Modbus RTU寫操作
代碼在“modbus_client.c”里,如下:
13.4.6 實現(xiàn)Modbus TCP操作
Modbus TCP的操作跟Modbus RTU的操作時同一套代碼,在如下函數(shù)中根據(jù)port_info確定是創(chuàng)建什么類型的 modbus_t結(jié)構(gòu)體:
13.4.7 實現(xiàn)OTA升級
傳感器升級設計各個傳感器內(nèi)部的實現(xiàn),后臺程序(控制中心)只是給出了接口。
前臺程序在如下界面中,把如下信息:固件文件名、設置的端口信息、升級哪個設備,發(fā)送給后臺程序(控制中心):
發(fā)送的信息存為如下結(jié)構(gòu)體:
然后使用如下函數(shù)發(fā)起RPC調(diào)用:
后臺程序(控制中心)對應的代碼如下:
在實現(xiàn)真正的傳感器升級時,前臺程序要知道升級進度,它可以調(diào)用如下函數(shù)發(fā)出RPC請求:
后臺程序(控制中心)對應的代碼如下:
13.5 LVGL前臺程序開發(fā)
源碼為:
我們要解析的代碼基本都在這個文件里:
“demo_lv_modbus_toollv_100ask_modbus_toolsrclv_modbus_tool.c”。
13.5.1 程序流程
LVGL前臺程序的源碼里,關鍵點有兩個:
如何布局、創(chuàng)建各類控件
它們的回調(diào)函數(shù)
1.布局的重要概念
布局、創(chuàng)建控件時,有一個“parent”的概念。可以認為“parent”是一個“容器”,在上面可以繼續(xù)創(chuàng)建各個控件。
比如下圖中,控件1對應綠色背景的區(qū)域,控件2對應大紅框的區(qū)域,控件1、控件2都是在同一個“parent”上創(chuàng)建處理的。這個“parent”是整個屏幕區(qū)域。
對于控件1,它也可以作為“parent”,在它上面有可以繼續(xù)創(chuàng)建按鈕:“+”按鈕、“Upgrade”按鈕、“MQTT Setting”按鈕:
對于控件2,它也可以作為“parent”,在它上面有可以繼續(xù)創(chuàng)建各類控件:
表示一個點時,界面如下。它本身又可以作為一個 parent,在里面繼續(xù)繪制各類控件:
2.控件的回調(diào)函數(shù)
當我們點擊某個按鈕時,會有對應的函數(shù)被調(diào)用,這就是它的回調(diào)函數(shù)。在回調(diào)函數(shù)里,我們可以彈出對話框,可以使用RPC讀寫傳感器。
3.main函數(shù)
main函數(shù)在“demo_lv_modbus_toolmain.c”中,代碼如下:
13.5.2 使用屏幕和鼠標
LVGL對基于Framebuffer的屏幕、鼠標的支持很完善,只需要提供設備節(jié)點即可。代碼如下:
13.5.3 創(chuàng)建初始界面
main函數(shù)里調(diào)用“l(fā)v_modbus_tool”,就開始創(chuàng)建界面了。它的代碼在“demo_lv_modbus_toollv_100ask_modbus_toolsrclv_modbus_tool.c”中。
1.第1個區(qū)域的創(chuàng)建
第1個區(qū)域指:
第1步:以整個屏幕為parent,創(chuàng)建出控件1。
第2步:以控件1為parent,創(chuàng)建出左邊的3個控件。
代碼如下:
2.第2個區(qū)域的創(chuàng)建
第2個區(qū)域指:
代碼如下:
3.“點”的創(chuàng)建
LVGL前臺程序運行時,會使用RPC調(diào)用獲得點的信息。對于每個點,都會創(chuàng)建出類似下面的控件:
代碼如下:
add_new_item函數(shù)是核心代碼,單獨講解。
13.5.4 add_new_item函數(shù)解析
1.代碼里層級的注釋
add_new_item函數(shù)里,創(chuàng)建了多層控件。在代碼的注釋里,怎么體現(xiàn)這些一層又一層的嵌套關系呢?使用類似“[0]、[1]”表示第1層,使用“[1-0]、[1-1]”表示第2層。
在使用“add_new_item”函數(shù)創(chuàng)建如下控件時,理解了注釋里的數(shù)字,更容易理解代碼:
最底層,表示“點”的整個區(qū)域,它沒有數(shù)字注釋。比如下面的cont2_x,它對應下圖紅框的區(qū)域(忽略里面的內(nèi)容):
cont2_x作為parent,作為底層,在上面創(chuàng)建了4個“child”。這些“child”的代碼注釋是“[0]、[1]、[2]、[3]”,如下:
“[0]”對應的控件:
“[1]”對應的控件:
“[1-0]”對應的控件:
2.代碼分析
add_new_item函數(shù)非常龐大,把源碼和圖案進行對比,才容易理解。
第1步,劃分區(qū)域得到cont2_x,如下:
第2步,在cont2_x里繼續(xù)劃分,得到cont2_x_1,如下:
第3步,在cont2_x_1里添加按鈕、復選框,代碼如下:
以后的操作是類似的,不再贅述。
-
傳感器
+關注
關注
2552文章
51318瀏覽量
755284 -
MODBUS
+關注
關注
28文章
1817瀏覽量
77162 -
程序開發(fā)
+關注
關注
0文章
30瀏覽量
10306 -
LibModbus
+關注
關注
0文章
10瀏覽量
7263 -
LVGL
+關注
關注
1文章
90瀏覽量
3009
原文標題:LVGL前臺程序開發(fā)相關操作 - RZ MPU工業(yè)控制教程連載(51)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論