RO通讯数据包

c 复制代码
#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 函数构建了相应的指令包和响应包。

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

相关推荐
BT-BOX1 小时前
STM32仿真proteus位带操作和keil增加头文件C文件
c语言·stm32·proteus
醉颜凉1 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
五味香4 小时前
Linux学习,ip 命令
linux·服务器·c语言·开发语言·git·学习·tcp/ip
lb36363636365 小时前
整数储存形式(c基础)
c语言·开发语言
浪里个浪的10245 小时前
【C语言】从3x5矩阵计算前三行平均值并扩展到4x5矩阵
c语言·开发语言·矩阵
<但凡.5 小时前
编程之路,从0开始:知识补充篇
c语言·数据结构·算法
f狐0狸x5 小时前
【数据结构副本篇】顺序表 链表OJ
c语言·数据结构·算法·链表
CoderBob6 小时前
【EmbeddedGUI】脏矩阵设计说明
c语言·单片机
浪里个浪的10246 小时前
【C语言】计算3x3矩阵每行的最大值并存入第四列
c语言·开发语言·矩阵
敲敲敲-敲代码6 小时前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏