当前位置: 首页 > news >正文

RO通讯数据包

#include <stdint.h>
#include <stdbool.h>// 设备状态结构体
typedef struct {uint8_t workingState;            // 工作状态uint8_t wifiStatus;              // WIFI状态uint8_t hotTankStatus;           // 热胆状态uint16_t rawWaterTDS;            // 原水TDS值uint16_t pureWaterTDS;           // 纯水TDS值uint8_t pacCartridgeLife;        // PAC滤芯寿命剩余值uint8_t roCartridgeLife;         // RO滤芯寿命剩余值uint16_t customFlow;             // 自定义出水流量uint8_t customTemperature;       // 自定义出水温度值uint8_t faultDisplay;            // 故障显示寄存器uint8_t tapStatus;               // 龙头状态uint8_t temperatureSetting;      // 定温出水温度uint8_t customTempSetting;       // 自定义定温出水温度值uint8_t flowSetting;             // 定量出水流量值uint16_t customFlowSetting;      // 自定义出水流量bool keyStates[8];               // 按键状态uint8_t hotTankStatusResponse;   // 热胆状态(响应包中的状态)
} DeviceData;// 全局设备数据实例
DeviceData deviceData = {.workingState = 0x00,            // 默认为上电状态.wifiStatus = 0x00,              // 默认为WIFI已连接.hotTankStatus = 0x00,           // 默认为热胆无操作.rawWaterTDS = 0,                // 默认原水TDS值为0.pureWaterTDS = 0,               // 默认纯水TDS值为0.pacCartridgeLife = 100,         // 默认PAC滤芯寿命为100%.roCartridgeLife = 100,          // 默认RO滤芯寿命为100%.customFlow = 100,               // 默认自定义出水流量为100mL.customTemperature = 0xFF,       // 默认为固定出水温度模式.faultDisplay = 0x00,            // 默认无故障.tapStatus = 0x00,               // 默认龙头关闭.temperatureSetting = 0x00,      // 默认常温水25℃.customTempSetting = 0,          // 默认自定义温度为0.flowSetting = 0x01,             // 默认定量出水流量为100mL.customFlowSetting = 100,        // 默认自定义出水流量为100mL.keyStates = {false},            // 默认所有按键未按下.hotTankStatusResponse = 0x00    // 默认热胆无操作
};// 更新设备状态
void updateDeviceData(const DeviceData *newData) {// 更新设备状态结构体中的数据deviceData.workingState = newData->workingState;deviceData.wifiStatus = newData->wifiStatus;deviceData.hotTankStatus = newData->hotTankStatus;deviceData.rawWaterTDS = newData->rawWaterTDS;deviceData.pureWaterTDS = newData->pureWaterTDS;deviceData.pacCartridgeLife = newData->pacCartridgeLife;deviceData.roCartridgeLife = newData->roCartridgeLife;deviceData.customFlow = newData->customFlow;deviceData.customTemperature = newData->customTemperature;deviceData.faultDisplay = newData->faultDisplay;deviceData.tapStatus = newData->tapStatus;deviceData.temperatureSetting = newData->temperatureSetting;deviceData.customTempSetting = newData->customTempSetting;deviceData.flowSetting = newData->flowSetting;deviceData.customFlowSetting = newData->customFlowSetting;for (int i = 0; i < 8; ++i) {deviceData.keyStates[i] = newData->keyStates[i];}deviceData.hotTankStatusResponse = newData->hotTankStatusResponse;
}// 获取设备状态
DeviceData getDeviceData() {return deviceData;
}// 计算校验和
uint8_t calculateChecksum(uint8_t *data, size_t length) {uint8_t sum = 0;// 循环计算校验和for (size_t i = 0; i < length; ++i) {sum += data[i];}return sum;
}// 构建从主板到水龙头的指令包
void buildMainboardCommand(uint8_t *commandBuffer, const DeviceData *data) {// 初始化包头commandBuffer[0] = 0xAA;commandBuffer[1] = 0xA8;commandBuffer[2] = 0x15; // 包长度// 设置工作状态commandBuffer[3] = data->workingState;// 设置WIFI状态commandBuffer[4] = data->wifiStatus;// 设置热胆状态commandBuffer[5] = data->hotTankStatus;// 设置原水TDS值commandBuffer[6] = (data->rawWaterTDS >> 8) & 0xFF;commandBuffer[7] = data->rawWaterTDS & 0xFF;// 设置纯水TDS值commandBuffer[8] = (data->pureWaterTDS >> 8) & 0xFF;commandBuffer[9] = data->pureWaterTDS & 0xFF;// 设置PAC滤芯寿命commandBuffer[10] = data->pacCartridgeLife;// 设置RO滤芯寿命commandBuffer[11] = data->roCartridgeLife;// 设置自定义出水流量commandBuffer[12] = (data->customFlow >> 8) & 0xFF;commandBuffer[13] = data->customFlow & 0xFF;// 设置自定义出水温度commandBuffer[14] = data->customTemperature;// 设置预留字段commandBuffer[15] = 0x00;commandBuffer[16] = 0x00;commandBuffer[17] = 0x00;commandBuffer[18] = 0x00;commandBuffer[19] = 0x00;commandBuffer[20] = 0x00;commandBuffer[21] = 0x00;// 设置故障显示寄存器commandBuffer[22] = data->faultDisplay;// 设置校验和uint8_t checksum = calculateChecksum(commandBuffer + 2, 21);commandBuffer[23] = checksum;
}// 构建从水龙头到主板的状态响应包
void buildTapResponse(uint8_t *responseBuffer, const DeviceData *data) {// 初始化包头responseBuffer[0] = 0xA6;responseBuffer[1] = 0x55;responseBuffer[2] = 0x15; // 包长度// 设置龙头状态responseBuffer[3] = data->tapStatus;// 设置定温出水温度responseBuffer[4] = data->temperatureSetting;// 设置自定义定温出水温度值responseBuffer[5] = data->customTempSetting;// 设置定量出水流量值responseBuffer[6] = (data->flowSetting >> 8) & 0xFF;responseBuffer[7] = data->flowSetting & 0xFF;// 设置自定义出水流量responseBuffer[8] = (data->customFlowSetting >> 8) & 0xFF;responseBuffer[9] = data->customFlowSetting & 0xFF;// 设置按键状态uint8_t keyState = 0;// 循环设置按键状态for (int i = 0; i < 8; ++i) {keyState |= (data->keyStates[i] ? 1 : 0) << (7 - i);}responseBuffer[10] = keyState;// 设置热胆状态responseBuffer[11] = data->hotTankStatusResponse;// 设置预留字段responseBuffer[12] = 0x00;responseBuffer[13] = 0x00;responseBuffer[14] = 0x00;responseBuffer[15] = 0x00;responseBuffer[16] = 0x00;responseBuffer[17] = 0x00;responseBuffer[18] = 0x00;responseBuffer[19] = 0x00;responseBuffer[20] = 0x00;responseBuffer[21] = 0x00;// 设置校验和uint8_t checksum = calculateChecksum(responseBuffer + 2, 21);responseBuffer[22] = checksum;
}// 用例:更新设备数据并构建指令包
int main() {// 创建新的设备数据DeviceData newData = {.workingState = 0x01,            // 日常待机状态.wifiStatus = 0x01,              // WIFI连接中.hotTankStatus = 0x02,           // 热胆补水已完成.rawWaterTDS = 200,              // 原水TDS值为200.pureWaterTDS = 50,              // 纯水TDS值为50.pacCartridgeLife = 80,          // PAC滤芯寿命为80%.roCartridgeLife = 90,           // RO滤芯寿命为90%.customFlow = 500,               // 自定义出水流量为500mL.customTemperature = 0x02,       // 自定义出水温度为65℃.faultDisplay = 0x00,            // 无故障.tapStatus = 0x02,               // 纯水打开(常温出水).temperatureSetting = 0x02,      // 泡发水65℃.customTempSetting = 65,         // 自定义温度为65℃.flowSetting = 0x03,             // 定量出水流量为500mL.customFlowSetting = 500,        // 自定义出水流量为500mL.keyStates = {true, false, true, false, true, false, true, false}, // 按键状态.hotTankStatusResponse = 0x02    // 热胆补水已完成};// 更新设备数据updateDeviceData(&newData);// 获取设备数据DeviceData currentData = getDeviceData();// 构建主控指令包uint8_t mainboardCommand[24];buildMainboardCommand(mainboardCommand, &currentData);// 构建水龙头响应包uint8_t tapResponse[24];buildTapResponse(tapResponse, &currentData);// 打印指令包内容(此处仅为示例,实际应用中应替换为实际的发送逻辑)printf("Mainboard Command:\n");for (int i = 0; i < sizeof(mainboardCommand); ++i) {printf("%02X ", mainboardCommand[i]);}printf("\n");printf("Tap Response:\n");for (int i = 0; i < sizeof(tapResponse); ++i) {printf("%02X ", tapResponse[i]);}printf("\n");return 0;
}

在这个示例中,我们首先定义了一个 DeviceData 结构体,并且创建了一个全局变量 deviceData 来保存设备的状态。接着,我们定义了 updateDeviceDatagetDeviceData 函数来更新和获取设备数据。最后,在 main 函数中,我们创建了一个新的设备数据实例 newData,更新了全局变量 deviceData,并通过 buildMainboardCommandbuildTapResponse 函数构建了相应的指令包和响应包。

这个用例展示了如何使用这些函数来更新设备状态,并根据最新的状态信息生成通讯数据包。在实际应用中,你可能需要将生成的数据包发送到串口或其他通信端口。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring
  • Datawhale x李宏毅苹果书AI夏令营深度学习详解进阶Task03
  • 基于生成对抗模型GAN蒸馏的方法FAKD及其在EdgesSRGAN中的应用
  • OpenGuass under Ubuntu_22.04 install tutorial
  • 基于Python实现AES加密与解密
  • 《QDebug 2024年8月》
  • 深度学习(二)-损失函数+梯度下降
  • 【数据结构】-----哈希
  • 【科研新手必备】如何高效、高质量、科学的科研?
  • 仿论坛项目--第二部分习题
  • JAVA进阶学习14
  • RuoYi-Cloud 部署与配置 [CentOS7]
  • 《深入浅出WPF》读书笔记.8路由事件
  • 使用pgrs在wsl中为postgres写拓展
  • huggingface.co 无法访问问题换源解决
  • JavaScript-如何实现克隆(clone)函数
  • 30天自制操作系统-2
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • EventListener原理
  • HTTP中GET与POST的区别 99%的错误认识
  • Javascript设计模式学习之Observer(观察者)模式
  • Java面向对象及其三大特征
  • Material Design
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SQLServer之创建数据库快照
  • 测试如何在敏捷团队中工作?
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 理解在java “”i=i++;”所发生的事情
  • 前端学习笔记之观察者模式
  • 如何用vue打造一个移动端音乐播放器
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 异常机制详解
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​configparser --- 配置文件解析器​
  • ​Java基础复习笔记 第16章:网络编程
  • ​ssh免密码登录设置及问题总结
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一些不规范的GTID使用场景
  • ‌移动管家手机智能控制汽车系统
  • #FPGA(基础知识)
  • #QT项目实战(天气预报)
  • $.ajax中的eval及dataType
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)常见O(n^2)排序算法解析
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (定时器/计数器)中断系统(详解与使用)
  • (理论篇)httpmoudle和httphandler一览
  • (三) diretfbrc详解
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET多线程执行函数
  • /bin/bash^M: bad interpreter: No such file ordirectory