forked from EmbeddedTeam/app_photomagnetic
refactor:use uart com protocal
This commit is contained in:
parent
0539014bfd
commit
d906bd7987
48
doc/通讯协议.md
Normal file
48
doc/通讯协议.md
Normal file
@ -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
|
||||||
|
|
||||||
|
```
|
||||||
46
src/main.cpp
46
src/main.cpp
@ -1,18 +1,36 @@
|
|||||||
#include <zephyr/device.h>
|
#include "zpp/fmt.hpp"
|
||||||
|
#include <etl/vector.h>
|
||||||
|
#include <led_strip_indicator/led_strip_indicator.hpp>
|
||||||
|
#include <uart_com/protocal.hpp>
|
||||||
|
#include <zephyr/drivers/hwinfo.h>
|
||||||
#include <zephyr/drivers/sensor.h>
|
#include <zephyr/drivers/sensor.h>
|
||||||
|
|
||||||
#include <zpp/device.hpp>
|
#include <zpp/device.hpp>
|
||||||
|
namespace {
|
||||||
#include "internal/photomagnetic_com/photomagnetic_com_device.hpp"
|
|
||||||
using namespace pmc;
|
|
||||||
|
|
||||||
auto sensor = DEVICE_DT_GET(DT_NODELABEL(godtek));
|
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};
|
volatile bool flag{false};
|
||||||
|
|
||||||
auto main(void) -> int {
|
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<StatusId>(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,
|
sensor_trigger tri{.type = SENSOR_TRIG_DATA_READY,
|
||||||
.chan = SENSOR_CHAN_AMBIENT_TEMP};
|
.chan = SENSOR_CHAN_AMBIENT_TEMP};
|
||||||
if (auto r = sensor_trigger_set(
|
if (auto r = sensor_trigger_set(
|
||||||
@ -23,19 +41,15 @@ auto main(void) -> int {
|
|||||||
};
|
};
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
uart_poll_out(uart, 0xAA);
|
|
||||||
}
|
|
||||||
k_msleep(100);
|
|
||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
sensor_value val{0, 0};
|
sensor_value val{0, 0};
|
||||||
if (sensor_sample_fetch_chan(sensor, SENSOR_CHAN_AMBIENT_TEMP) == 0) {
|
if (sensor_sample_fetch_chan(sensor, SENSOR_CHAN_AMBIENT_TEMP) == 0) {
|
||||||
sensor_channel_get(sensor, SENSOR_CHAN_AMBIENT_TEMP, &val);
|
sensor_channel_get(sensor, SENSOR_CHAN_AMBIENT_TEMP, &val);
|
||||||
dev.UpdateTemperature(&val);
|
const uint8_t data[2] = {static_cast<uint8_t>(val.val1),
|
||||||
|
static_cast<uint8_t>(val.val2)};
|
||||||
|
pmc.Send("temp", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev.SendTemperature(&val);
|
|
||||||
flag = false;
|
flag = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user