通过modbus与串口屏通讯控制

串口屏作为modbus主机,下位机主板作为从机,在从机中建立一张数据表与串口屏作为数据交换缓冲,从机移植freemodbus协议栈,定时响应串口屏的轮询

如下,在一个项目中建立的数据表

//上报给屏的槽状态
typedef struct _db_slot_status{uint16_t            header_cnt_before_renewing; //换油前烹饪头数uint16_t            header_cnt_total;           //总计头数uint16_t            cooking_cnt_total;          //烹饪计数db_time_t           recvy_time;                 //槽回温时间db_time_t           cooking_time;               //烹饪时间uint16_t            temp;                       //槽温度uint16_t            target_temp;                //设定目标温度uint16_t            cooking_mode;               //关机模式,融油模式,节能模式,预热模式,烹饪模式,滤油模式uint16_t            cooking_seg;                //当前段号uint16_t            cooking_status;             //烹饪状态,1工作或0停止db_time_t           total_time;                 //烹饪的总时间uint16_t            preheat_highlight;          //预热位,一个位对应一个菜单,置1高亮
}db_slot_status_t;//主板上报给屏的状态
typedef union _db_status{uint16_t            zone[DB_STATUS_SIZE];struct{uint16_t            second;                     //主板时间秒uint16_t            minute;                     //主板时间分uint16_t            hour;                       //主板时间时uint16_t            day;                        //主板时间日uint16_t            month;                      //主板时间月uint16_t            year;                       //主板时间年uint16_t            week;                       //主板时间星期
//        uint16_t            firmware_ver;               //固件版本
//        uint16_t            hardware_ver;               //对应的硬件版本
//        uint16_t            serial_number[4];           //序列号
//        uint16_t            compile_date[12];           //编译日期uint16_t            cooking_cnt[DB_MENU_MAX];   //产品烹饪计数uint16_t            wifi_status;                //0-连接断开,1-连接WFI,2-连接服务器db_slot_status_t    slot_l_status;              //左槽状态db_slot_status_t    slot_r_status;              //右槽状态}data;
}db_status_t;//自检数据
typedef union _db_selftest{uint16_t        zone[DB_SELFTEST_SIZE];struct{uint16_t    input1;uint16_t    input2;uint16_t    input3;uint16_t    input4;uint16_t    input5;uint16_t    input6;uint16_t    left_temp;uint16_t    right_temp;uint16_t    cpu_temp;uint16_t    voltage;uint16_t    current;}data;
}db_selftest_t;typedef struct _db_para{//这两组参数是用户操作的即时控制及上报,不需保存db_ctrl_t           ctrl;                           //控制参数db_status_t         status;                         //状态参数
//    db_selftest_t       selftest;                       //自检状态//这两组参数需要保存到主板db_function_t       function;                       //功能参数db_cooking_menu_t   cooking_menu[DB_MENU_MAX];      //菜单参数}db_para_t;

modbus初始化将modbus指针指向建立的数据表

 db_para_ptr = (db_para_t*)usSRegHoldBuf;

以下为modbus任务线程,检查数据是否有被用户修改,如被修改进行用户操作处理

void mlcd_check_variation(void)
{static uint8_t  crc=0,crc_new,user_update=0;static time_t  last_time;if( crc==0 ){//计算除去状态后的参数校验码crc = crc8_cal((uint8_t*)db_para_ptr+DB_START_ADDR, DB_SAVE_LEN);}//数据被用户通过屏幕修改crc_new = crc8_cal((uint8_t*)db_para_ptr+DB_START_ADDR, DB_SAVE_LEN);if( crc != crc_new ){crc = crc_new;last_time = time(RT_NULL);user_update = 1;}//用户更新10秒后保存数据else if( user_update ){if( time(RT_NULL)-last_time > 10 ){save_flag = 1;user_update = 0;}}
}static void mlcd_task(void *parameter)
{eMBInit( MB_RTU, 0x01, 2, 115200, MB_PAR_NONE );eMBEnable();rt_tick_t tick =  rt_tick_get();while(1){eMBPoll();mlcd_check_variation();tick_invent = rt_tick_get()-tick;if( tick_invent>200 )tick_cnt++;tick =  rt_tick_get();rt_thread_delay(10);}
}

由于串口屏是以地址方式定位数据单元,以下两个宏用于获取数据表中相应单元的地址比较简便的方法

/** 计算结构体成员偏移地址 */  
#define offsetof(TYPE, MEMBER) ((int)(&((TYPE *)0)->MEMBER))/** 根据成员地址获取结构首指针 */  
#define container_of(ptr, type, member) ({   \const typeof( ((type *)0)->member ) *__mptr = (ptr); \(type *)( (char *)__mptr - offsetof(type,member) );})

这种方式驱动串口屏不用关心modbus通讯,只需关注数据是否被修改,如要显示显示,将数据表相应单元的填充数据即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动售货机销售数据分析与应用

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 摘要: 本案例将主要结合自动售货机的实际情况&#xff0…

APISIX 中ETCD 的问题

1. 问题1 : Error: client: etcd cluster is unavailable or misconfigured; error #0: client: endpoint http://etcd:2379 exceeded header timeout error #0: client: endpoint http://etcd:2379 exceeded header timeout 修改APISIX config ETCD_ADVERTISE_CL…

folium 增加搜索、经纬度弹出,字段弹出的方法

m.add_child(folium.LatLngPopup()) cellgeogpd.read_postgis(‘SELECT “铜陵3G第二批拍照基站”.*,region.name FROM “铜陵3G第二批拍照基站”,(SELECT geom,“name” from “gis_县” where 市‘铜陵市’ and name‘枞阳县’) as region where st_intersects(“铜陵3G第二…

wordpress的lnmp环境一键安装和手工配置

1. 使用oneinstack安装lnmp环境,按照"Recommend PHP 7.4 or greater and MySQL version 5.7 or MariaDB version 10.4 or greater."的wordpress官方建议配置生成安装脚本。配置后在/root/oneinstack/options.conf中可找到安装的相关目录位置和密码等。 2.…

23.10.7.sql 里面的DISTINCT

例如: SELECT DISTINCT t.container_no FROM biz_inventory_task_detail t 这里distinct干嘛的 解释: DISTINCT是一个关键字,用于在SELECT语句中返回唯一不重复的值。 在这个查询中,使用DISTINCT关键字,是为了返回biz…

虹科方案丨自动驾驶多传感器数据融合方法

文章来源:雅名特自动驾驶 点此阅读原文:https://mp.weixin.qq.com/s/QsPMWZDGZaPdEx47L2VmeA 近年来,深度学习技术在涉及高维非结构化数据领域展现出了最先进的性能,如计算机视觉、语音、自然语言处理等方面,并且开始涉…

C++泛型编程--模版

这里写目录标题 模板特点 函数模版语法注意事项二级目录二级目录二级目录二级目录二级目录二级目录二级目录 模板 特点 函数模版 语法 最上面一行是在声明 我要创建模板了 其中T可以替换 但是一般都用T 因为他是template的首字母 之后 进行函数定义与声明 使用背景&#xff…

信息系统项目管理师第四版学习笔记——项目绩效域

干系人绩效域 干系人绩效域涉及与干系人相关的活动和职能。在项目整个生命周期过程中,有效执行本绩效域可以实现的预期目标主要包含:①与干系人建立高效的工作关系;②干系人认同项目目标;③支持项目的干系人提高了满意度&#xf…

基于SpringBoot的健身房管理系统

目录 前言 一、技术栈 二、系统功能介绍 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步…

【设计模式】八、桥接模式

文章目录 举例问题分析基本介绍桥接模式在 JDBC 的源码剖析桥接模式的注意事项和细节JDBC 举例 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等), 传统方法对应的类图: 问题分析 扩展性问题(类爆炸)&#xff…

[Framework] Android Handler 工作原理

Android 中的 Handler 都被人说烂了,但是还是想多说一次,因为在 Android 的系统中它真的非常重要而且它的机制并没有很复杂,无论是新手和老手都可以好好学习下,这对理解 Android 系统很重要,所以说学习的性价比非常高。…

TCP/IP(五)TCP的连接管理(二)三次握手细节

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注: 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人: 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

scsi READ CAPACITY (10)命令总结

READ CAPACITY (10)概述: READ CAPACITY(10)命令(参见表119)请求设备服务器将描述直接访问块设备的容量和介质格式的8字节参数数据传输到数据缓存中。这个命令可以被处理,就好像它有一个HEAD OF QUEUE任务属性。 如果逻辑单元支持保护信息,应…

渗透测试KAILI系统的安装环境(第八课)

KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架,其核心思想是面向服务的架构(SOA),支持http、websocket、tcp等多种通信协议,同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…

gradle

Gradle Gradle 介绍 Gradle 官方文档是这样介绍的 Gradle 的: Gradle is an open-source build automationopen in new window tool flexible enough to build almost any type of software. Gradle makes few assumptions about what you’re trying to build or…

相机噪声评估

当拥有一个相机,并且写了一个降噪的算法,想要测试降噪的应用效果。 相机在光线不足的情况下产生噪点的原因主要与以下几个因素有关: 感光元件的工作原理:相机的图像传感器是由数百万甚至数千万的感光元件(如CMOS或CC…

怎么把heic改成jpg?方法大全在这里

怎么把heic改成jpg?HEIC是一种现代的图像文件格式。它是由ISO制定的标准,并得到了苹果公司的支持和推广。与JPG等传统图像格式相比,HEIC格式可以提供更好的图像质量,并且占用更少的存储空间。这使得它在手机、平板电脑和其他移动设…

CANoe-如何实现27服务解锁

27服务解锁的工作原理可以在文章《诊断27服务介绍》查看,这里简单介绍下流程: Tester向ECU发送27 01诊断请求请求种子seed,ECU收到该请求后随机生成一个seed,通过67 01诊断响应发送给Tester。Tester收到该诊断响应后取出seed值,传入和ECU相同的算法后生成一个密钥keyT。然…

《理解深度学习》2023最新版本+习题答案册pdf

刚入门深度学习或者觉得学起来很困难的同学看过来了,今天分享的这本深度学习教科书绝对适合你。 就是这本已在外网获13.1万次下载的宝藏教科书《理解深度学习》。本书由巴斯大学计算机科学教授Simon J.D. Prince撰写,全书共541页,目前共有21…

Vscode 插件-代码敲出不同的特效

为了让写代码的时候增加一点趣味性,vscode有个插件,可以增加烟花特效,还挺好玩的。 一.在应用商店下载这个插件 二. 在设置里 添加配置文件 settings.json //是否开启"powermode.enabled": true,//效果样式 “水花-particles”,…