一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解框架設(shè)計(jì)

瑞薩MCU小百科 ? 來(lái)源:瑞薩MCU小百科 ? 2025-01-09 16:48 ? 次閱讀

13.2 框架設(shè)計(jì)

13.2.1 程序?qū)哟?/strong>

如下圖所示:

①程序總體劃分為:LVGL前臺(tái)程序,后臺(tái)程序。這使得GUI和后臺(tái)程序分開,可以很容易升級(jí)、替換GUI程序。

②LVGL程序:顯示界面,是用戶和后臺(tái)程序的橋梁,把用戶的指令下發(fā)給后臺(tái)程序,把后臺(tái)上報(bào)的數(shù)據(jù)在界面顯示出來(lái)。

③后臺(tái)程序(控制中心):根據(jù)前臺(tái)程序的指示去操作設(shè)備,比如把用戶設(shè)置的參數(shù)傳遞給MQTT程序、通知 modbus_tcp_server、通過(guò)RS485接口操作傳感器。

④MQTT程序:根據(jù)后臺(tái)程序的指示連接MQTT服務(wù)器、發(fā)布消息,訂閱消息。

⑤modbus_tcp_server:根據(jù)后臺(tái)程序的指示操作本地傳感器

a8e68320-ce3f-11ef-9310-92fbcf53809c.png

13.2.2 后臺(tái)程序(控制中心)功能

后臺(tái)程序(控制中心),是程序的核心。它實(shí)現(xiàn)了各類RPC接口(遠(yuǎn)程調(diào)用接口),供前臺(tái)程序、MQTT程序使用,比如:

①前臺(tái)程序啟動(dòng)后,咨詢后臺(tái)程序,顯示出上次用戶配置的“點(diǎn)”

②前臺(tái)程序通過(guò)RPC接口對(duì)“點(diǎn)”進(jìn)行讀、寫操作

③前臺(tái)程序增加、刪除點(diǎn)時(shí),也是調(diào)用RPC接口

④前臺(tái)程序進(jìn)行MQTT設(shè)置、升級(jí)操作時(shí),也是使用RPC接口通知后臺(tái)程序

⑤MQTT程序通過(guò)RPC接口獲得MQTT設(shè)置信息、要操作的“點(diǎn)”的信息

⑥MQTT程序通過(guò)RPC接口讀、寫“點(diǎn)”

1. 兩個(gè)核心操作對(duì)象

一個(gè)是PointInfo結(jié)構(gòu)體,用來(lái)表示“點(diǎn)”。另一個(gè)是MQTTInfo結(jié)構(gòu)體,用來(lái)表示MQTT信息。

工業(yè)控制領(lǐng)域,通過(guò)modbus操作傳感器時(shí),核心單位是“點(diǎn)”。它包含這些信息:

①使用什么協(xié)議?Modbus RTU還是Modbus TCP?

對(duì)于Modbus RTU,使用哪個(gè)串口?數(shù)據(jù)格式(數(shù)據(jù)位/檢驗(yàn)位/停止位)是什么?

對(duì)于Modbus TCP,IP和端口是什么?

②設(shè)備地址是?

寄存器地址是?

④寄存器類型是?

針對(duì)“點(diǎn)”,本項(xiàng)目定義了一個(gè)結(jié)構(gòu)體來(lái)表示“點(diǎn)的信息”,如下:

左右滑動(dòng)查看完整內(nèi)容

typedef struct PointInfo {
 int point;
 char port_info[100];
 int dev_addr;
 int reg_addr;
 char reg_type[4];
 int period; /* ms */
}PointInfo, *PPointInfo;

point:點(diǎn)的索引,一個(gè)唯一的整數(shù),通過(guò)它可以找到某個(gè)“點(diǎn)”。

port_info:端口信息,表示串口時(shí)格式為“/dev/ttyUSB0,115200,8N1”;表示網(wǎng)絡(luò)時(shí)格式為“192.168.5.89:1052”。

dev_addr:設(shè)備地址

reg_addr:寄存器地址

reg_type:寄存器類型,有“0x”、“1x”、“4x”、“3x”四種取值。

period:讀取周期(單位ms)。

結(jié)構(gòu)體的信息,跟前臺(tái)程序?qū)?yīng),用一個(gè)PointInfo結(jié)構(gòu)體描述界面里這一個(gè)元素:

a8fcad08-ce3f-11ef-9310-92fbcf53809c.png

在前臺(tái)程序增加、修改、刪除、讀取、寫“點(diǎn)”時(shí),操作的就是對(duì)應(yīng)的PointInfo結(jié)構(gòu)體。所有的“點(diǎn)”信息,會(huì)保存在PointInfo結(jié)構(gòu)體數(shù)組里。

前臺(tái)程序設(shè)置MQTT信息時(shí),mqtt_client_app獲得MQTT 信息時(shí),這些信息都使用一個(gè)結(jié)構(gòu)體表示:

typedef struct MQTTInfo {
 char broker[100];
 int port;
 char client_id[100];
 char user[100];
 char password[100];
 char publish[100];
 char subcribe[100];
}MQTTInfo, *PMQTTInfo;

2. 交互示例

RPC是遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call)的意思,而json是比較流行的傳遞信息的格式。

前臺(tái)程序和后臺(tái)程序之間使用“json-rpc”進(jìn)行遠(yuǎn)程調(diào)用:前臺(tái)程序發(fā)出請(qǐng)求,后臺(tái)程序處理請(qǐng)求返回結(jié)果。

比如前臺(tái)程序增加一個(gè)點(diǎn)時(shí),調(diào)用如下函數(shù)通知后臺(tái)程序:

a9122426-ce3f-11ef-9310-92fbcf53809c.png

這會(huì)導(dǎo)致后臺(tái)程序調(diào)用如下函數(shù):

a9301a9e-ce3f-11ef-9310-92fbcf53809c.png

它把cJSON格式的參數(shù)解析出來(lái)后,調(diào)用本地函數(shù):

a9437648-ce3f-11ef-9310-92fbcf53809c.png

3. RPC接口

定義好RPC接口后,前臺(tái)程序、后臺(tái)程序就可以獨(dú)立開發(fā)。在“controle_center”程序的rpc.h里定義了如下RPC接口。

①詢問(wèn)后臺(tái)程序有多少個(gè)點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 詢問(wèn)后臺(tái)程序有多少個(gè)點(diǎn)
* 返回值:(-1)錯(cuò)誤, (>=0) 點(diǎn)的個(gè)數(shù)
*/
int rpc_get_point_count(int iSocketClient);

②詢問(wèn)后臺(tái)程序取出下一個(gè)點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 詢問(wèn)后臺(tái)程序取出下一個(gè)點(diǎn)(point > pre_point 的第 1 個(gè)點(diǎn))
* 返回值:(-1)錯(cuò)誤, (>=0) 點(diǎn)的個(gè)數(shù)
*/
int rpc_get_next_point(int iSocketClient, int pre_point, PPointInfo pInfo);

使用①②,就可以得到所有的點(diǎn)的信息,示例代碼為:

左右滑動(dòng)查看完整內(nèi)容

int cnt = rpc_get_point_count(fd);
if (cnt > 0)
{
printf("point count = %d
", cnt);
}
int pre_point = -1;
PointInfo tInfo;
for (int i = 0; i < cnt; i++)
{
 err = rpc_get_next_point(fd, pre_point, &tInfo);
 if (!err)
 {
 printf("Point %d:
", tInfo.point);
 printf("port_info: %s
", tInfo.port_info);
 printf("dev_addr: %d
", tInfo.dev_addr);
 printf("reg_addr: %d
", tInfo.reg_addr);
 printf("reg_type: %s
", tInfo.reg_type);
 printf("period: %d
", tInfo.period);
 }
 pre_point = tInfo.point;
}

③增加點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* port_info: "/dev/ttyUSB0,115200,8n1" or "192.168.0.123:234"
* dev_addr: modbus device address
* reg_addr: register address
* reg_type: "0x" - Coils, "1x" - Discrete Inputs, "4x" - Holding Registers, "3x" - I
nput Registers
* period: 訪問(wèn)周期(ms)
* 返回值: -1 失敗, 其他值:唯一的句柄
*/
int rpc_add_point(int iSocketClient, char *port_info, int dev_addr, int reg_addr, cha
r *reg_type, int period);

④刪除點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 移除一個(gè)點(diǎn)
* point: 要移除的點(diǎn)
*/
int rpc_remove_point(int iSocketClient, int point);

⑤修改點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 修改點(diǎn)
* point: 要修改的點(diǎn)
*
* port_info: "/dev/ttyUSB0,115200,8n1" or "192.168.0.123:234"
* dev_addr: modbus device address
* reg_addr: register address
* reg_type: "0x" - Coils, "1x" - Discrete Inputs, "4x" - Holding Registers, "3x" - I
nput Registers
* period: 訪問(wèn)周期(ms)
* 返回值: -1 失敗, 其他值:唯一的句柄
*/
int rpc_modify_point(int iSocketClient, int point, char *port_info, int dev_addr, int
reg_addr, char *reg_type, int period);

⑥讀點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 讀數(shù)據(jù)
* point: 哪個(gè)點(diǎn)
*/
int rpc_read_point(int iSocketClient, int point, int *val);

⑦寫點(diǎn):

左右滑動(dòng)查看完整內(nèi)容

/* 寫數(shù)據(jù)
* point: 哪個(gè)點(diǎn)
* val: 要寫入的數(shù)值
*/
int rpc_write_point(int iSocketClient, int point, int val);

⑧升級(jí)功能:

左右滑動(dòng)查看完整內(nèi)容

/* 開始升級(jí)傳感器
*/
int rpc_start_update(int iSocketClient, PUpdateInfo ptUpdateInfo);
/* 詢問(wèn)后臺(tái)程序升級(jí)進(jìn)度
* 返回值:(-1)錯(cuò)誤, (>=0) 進(jìn)度(0~100)
*/
int rpc_get_update_percent(int iSocketClient);

⑨MQTT配置:

左右滑動(dòng)查看完整內(nèi)容

/* 詢問(wèn)后臺(tái)程序獲得 MQTT 信息
*/
int rpc_get_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo);
/* 設(shè)置后臺(tái)程序的 MQTT 信息
*/
int rpc_set_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo);

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • MPU
    MPU
    +關(guān)注

    關(guān)注

    0

    文章

    400

    瀏覽量

    49519
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3817

    瀏覽量

    82168
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    662

    瀏覽量

    23358

原文標(biāo)題:框架設(shè)計(jì) - RZ MPU工業(yè)控制教程連載(48)

文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式里通用微秒計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

    今天給大家分享的是嵌入式里通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)。
    的頭像 發(fā)表于 10-14 12:41 ?2052次閱讀

    Python技術(shù)學(xué)習(xí)之Django框架設(shè)計(jì)思想

    返回的html。以上是老男孩教育對(duì)Django框架設(shè)計(jì)思想的簡(jiǎn)要介紹,想要了解更多信息,快來(lái)參加老男孩教育Python培訓(xùn)班吧,讓您輕松掌握高深Python技能!
    發(fā)表于 06-15 15:01

    框架設(shè)計(jì)中的常用模式有哪些

    。消息訂閱模式最常見的問(wèn)題是同步模式下如何處理重入和超時(shí)。作為框架設(shè)計(jì)者,一定要考慮好這個(gè)問(wèn)題。所謂重入,是二次開發(fā)者在消息的回調(diào)函數(shù)中執(zhí)行訂閱/取消訂閱的操作,這會(huì)破壞消息訂閱的機(jī)制。所謂超時(shí)是指二次開發(fā)
    發(fā)表于 12-17 16:44

    STM32F407的HAL庫(kù)框架設(shè)計(jì)

    第12章 STM32F407的HAL庫(kù)框架設(shè)計(jì)學(xué)習(xí)通過(guò)本章節(jié),主要是想讓大家對(duì)HAL庫(kù)程序設(shè)計(jì)的基本套路有個(gè)了解,防止踩坑。目錄第12章 STM32F407的HAL庫(kù)框架設(shè)計(jì)學(xué)習(xí)12.1 初學(xué)者重要
    發(fā)表于 08-10 06:23

    怎么實(shí)現(xiàn)ThreadX內(nèi)核模板框架設(shè)計(jì)?

    怎么實(shí)現(xiàn)ThreadX內(nèi)核模板框架設(shè)計(jì)?
    發(fā)表于 11-29 07:45

    聊聊我對(duì)單片機(jī)程序的整體框架設(shè)計(jì)的一些思路體會(huì)

    RTOS?;蛘呤褂肦TOS,在整體思路上比較迷茫,不知從何入手,所以本文來(lái)聊聊我對(duì)單片機(jī)程序的整體框架設(shè)計(jì)的一些思路體會(huì)。為啥要討論架構(gòu)單片機(jī)系統(tǒng)開發(fā)人員的目標(biāo)之一是在編程環(huán)境中創(chuàng)建固件,以實(shí)現(xiàn)低成本系...
    發(fā)表于 02-23 07:30

    HDF驅(qū)動(dòng)框架設(shè)計(jì)匯總分享

    1、HDF驅(qū)動(dòng)框架之linux驅(qū)動(dòng)開發(fā)介紹什么是驅(qū)動(dòng)開發(fā)?這個(gè)看似不是問(wèn)題的問(wèn)題卻很重要,我們必須需要從這一步開始理清楚,見下圖:HDF 驅(qū)動(dòng)框架探路(一):2、HDF驅(qū)動(dòng)框架之應(yīng)用態(tài)打通內(nèi)核的
    發(fā)表于 03-15 15:31

    構(gòu)架設(shè)計(jì)

    構(gòu)架設(shè)計(jì),這種構(gòu)架設(shè)計(jì)是新的知識(shí)希望能夠得到一本,可以繼續(xù)發(fā)展構(gòu)架思維和構(gòu)架設(shè)計(jì)靈感。
    發(fā)表于 12-18 11:09

    基于GIS的城鄉(xiāng)公交系統(tǒng)框架設(shè)計(jì)與實(shí)現(xiàn)

    本文在分析建立城鄉(xiāng)公交信息系統(tǒng)意義的基礎(chǔ)上,通過(guò)詳細(xì)調(diào)研城鄉(xiāng)公交工作需求,規(guī)劃和設(shè)計(jì)了基于GIS 的城鄉(xiāng)公交信息系統(tǒng)的框架設(shè)計(jì),功能結(jié)構(gòu),并根據(jù)系統(tǒng)功能需要,在簡(jiǎn)
    發(fā)表于 12-19 14:12 ?8次下載

    基于CAN總線的通訊系統(tǒng)軟件框架設(shè)計(jì)

    基于CAN總線的通訊系統(tǒng)軟件框架設(shè)計(jì)
    發(fā)表于 01-24 16:54 ?21次下載

    基于ARM Cortex-M4的MQX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)

    基于ARM Cortex-M4的MQX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)
    發(fā)表于 09-25 08:29 ?6次下載
    基于ARM Cortex-M4的MQX中斷機(jī)制分析與中斷程序<b class='flag-5'>框架設(shè)</b>計(jì)

    基于ARMCortex_M4的MOX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)

    基于ARMCortex_M4的MOX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)
    發(fā)表于 09-28 09:13 ?4次下載
    基于ARMCortex_M4的MOX中斷機(jī)制分析與中斷程序<b class='flag-5'>框架設(shè)</b>計(jì)

    Inside<SPAN class=“analog-coupler”>i</span>Coupler<sup>?</sup>技術(shù):封裝和引線框架設(shè)計(jì)

    InsideiCoupler?技術(shù):封裝和引線框架設(shè)計(jì)
    發(fā)表于 05-18 19:12 ?3次下載
    Inside<SPAN class=“analog-coupler”>i</span>Coupler<sup>?</sup>技術(shù):封裝和引線<b class='flag-5'>框架設(shè)</b>計(jì)

    C 單片機(jī)項(xiàng)目框架設(shè)計(jì)要點(diǎn)

    1、項(xiàng)目架構(gòu)???? 好的項(xiàng)目架構(gòu)不僅開發(fā)便捷,二次開發(fā)更加方便,后期維護(hù)也容易上手。所以在項(xiàng)目之前就要將框架搭建好,考慮整體架構(gòu)以及后期的功能拓展。2、架構(gòu)分級(jí)???? 根據(jù)功能需求,一般分為三級(jí)
    發(fā)表于 11-04 16:36 ?15次下載
    C 單片機(jī)項(xiàng)目<b class='flag-5'>框架設(shè)</b>計(jì)要點(diǎn)

    智慧城市方案框架設(shè)計(jì)

    涉及智慧樓宇方案框架
    發(fā)表于 06-08 14:29 ?0次下載