From d906bd7987c6345a6f7528faf4cc4b71976d949c Mon Sep 17 00:00:00 2001 From: zys Date: Tue, 3 Mar 2026 22:22:34 +0800 Subject: [PATCH] =?UTF-8?q?refactor=EF=BC=9Ause=20uart=20com=20protocal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/通讯协议.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 46 ++++++++++++++++++++++++++++++---------------- 2 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 doc/通讯协议.md diff --git a/doc/通讯协议.md b/doc/通讯协议.md new file mode 100644 index 0000000..e5f60ed --- /dev/null +++ b/doc/通讯协议.md @@ -0,0 +1,48 @@ +# 串口通信协议设计文档 + +- **帧结构**:`[起始标志:16bit][数据指令类型][数据字节数:8bit][数据][CRC]` + - CRC从[数据指令类型]到[数据]结束 + - 温度:0x00指令 + - 主板请求:0x[7ee7][00][00][crc16] + - 小板回:0x[7ee7][00][02][2411][crc16] + - 主板请求时,小板回复温度 + - id:0x01指令 + - 主板发 0x[7ee7][01][00][crc16] + - 小板发 0x[7ee7][01][03][989680][crc16] + - 主板请求时,小板回复id + - 小板在系统上电时,主动发一次id + - 运行状态:0x02指令 + - 主板发 0x[7ee7][02][01][状态值][crc16] + - 主板在运行状态变化时,主动向小板上报状态 + - 状态值定义: + - 0x00:待机中 + - 0x01:运行中 + - 0x02:暂停中 + - 0x03:故障中 + +```mermaid +sequenceDiagram +participant S as 小板 (传感器) +participant M as 主板 (控制板) +Note over S: 系统上电 + S ->> M: 【主动】发送 ID 信息 (0x01 指令帧) + + Note over S, M: 周期性温度上报 (每 20ms 一次) + loop 每 20ms + S ->> M: 【主动】发送温度数据帧 (0x00 指令) + end + + Note over M, S: CRC 校验范围:从帧第 3 字节开始至 CRC 前 + + Note over M: 主板运行状态变化 + M ->> S: 【主动】发送运行状态 (0x02 指令帧) + + opt 主板查询 + M ->> S: 请求 ID 信息 (0x01 指令帧) + S -->> M: 回复 ID 序列号 + + M ->> S: 请求 温度 信息 (0x00 指令帧) + S -->> M: 回复 温度 数据 + end + +``` diff --git a/src/main.cpp b/src/main.cpp index 7d54a3f..fc910f9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,36 @@ -#include +#include "zpp/fmt.hpp" +#include +#include +#include +#include #include - #include - -#include "internal/photomagnetic_com/photomagnetic_com_device.hpp" -using namespace pmc; - +namespace { auto sensor = DEVICE_DT_GET(DT_NODELABEL(godtek)); -auto uart = DEVICE_DT_GET(DT_NODELABEL(usart2)); +auto &pmc = ZPP_DRV_GET(uart_com::Protocal, DT_NODELABEL(pm_protocal)); +auto &led_strip = ZPP_DRV_GET(ledstrip::Indicator, DT_NODELABEL(indicator)); +enum Command { kTemp = 0x00, kGetId, kRunningState }; +enum RunningState {}; +constexpr auto kDeviceIdSize = 20; +enum StatusId : uint8_t { kRunning, kPause, kError, kStandby }; + +} // namespace volatile bool flag{false}; - auto main(void) -> int { - auto &dev = ZPP_DEVICE_GET_BY_NODE(PmcComDevice, pmc_com); + pmc.SetRxCallback(kGetId, [](uart_com::DataType data) -> void { + uint8_t buffer[kDeviceIdSize]; + auto size = hwinfo_get_device_id(buffer, sizeof(buffer)); + pmc.Send("id", uart_com::DataType(buffer, size)); + }); + + pmc.SetRxCallback(kRunningState, [](uart_com::DataType data) -> void { + auto state = static_cast(data[0]); + led_strip.Status(state).on_error([](zpp::error_code code) { + zpp::println("Status Error: {}", zpp::error_str(code)); + }); + }); + sensor_trigger tri{.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_AMBIENT_TEMP}; if (auto r = sensor_trigger_set( @@ -23,19 +41,15 @@ auto main(void) -> int { }; while (1) { - for (int i = 0; i < 16; i++) { - uart_poll_out(uart, 0xAA); - } - k_msleep(100); - if (flag) { sensor_value val{0, 0}; if (sensor_sample_fetch_chan(sensor, SENSOR_CHAN_AMBIENT_TEMP) == 0) { sensor_channel_get(sensor, SENSOR_CHAN_AMBIENT_TEMP, &val); - dev.UpdateTemperature(&val); + const uint8_t data[2] = {static_cast(val.val1), + static_cast(val.val2)}; + pmc.Send("temp", data); } - dev.SendTemperature(&val); flag = false; } }