nuttx实战项目:多路串口合并功能之七主app需求设计 - 详解
基于宏定义串口配置的转发与探测管理系统需求说明(含心跳上报)
1. 项目整体需求
本项目实现一个串口转发与设备管理程序,功能如下:
- 上位机通过 UART_MAIN 接收数据并解包,根据设备类型下发至 UART_DEVICE_A–D。
- 芯片通过 UART_DEVICE_A–D 接收设备数据,进行简单封包后通过 UART_MAIN 上传至上位机。
- 程序通过设备特征数据进行 设备初始化探测与后续热插拔管理。
- 探测线程在完成每次扫描后,统一上报设备状态心跳包。
2. 串口宏定义
通过宏配置各个串口设备路径:
#define UART_MAIN "/dev/ttyS1"
#define UART_DEVICE_A "/dev/ttyS2"
#define UART_DEVICE_B "/dev/ttyS3"
#define UART_DEVICE_C "/dev/ttyS4"
#define UART_DEVICE_D "/dev/ttyS5"
3. 全局数据结构
结构体 port_device:
串口名称(从宏定义赋值)
串口文件句柄
设备 ID
- 0:BIS
- 1:Brain_O2
- 2:Muscle
- 3:Blood
- 0xFF:未绑定设备
last_rx_time:最后一次接收到消息的时间
4. 初始化流程
主线程打开 UART_DEVICE_A–D,并保存句柄到
port_device数组。主线程执行 初始化探测,绑定已连接设备。
探测完成后:
- 启动 探测线程,持续更新绑定关系与状态上报。
- 主线程进入数据上报循环。
5. 探测与热插拔管理线程
探测线程每秒执行一次,流程如下:
超时释放
- 遍历所有已绑定端口,若
last_rx_time超过 3s,则清除绑定。
- 遍历所有已绑定端口,若
未绑定端口探测
对
device_id == 0xFF的端口:若有接收数据,按规则绑定。
若 1.5s 内无数据,则发送一次探测包,等待 0.5s:
- 收到数据 → 绑定(仅可能是 Brain_O2)。
- 无数据 → 探测结束。
Brain_O2 保活
- 若已绑定,则周期性发送探测包(1–2s 区间)。
- 回复由接收线程处理,用于刷新
last_rx_time。
心跳状态上报
探测流程结束后,生成设备状态心跳包,上报至 UART_MAIN:
[0xAA 0xAA 0xAA] [00 06] [0xFF] [0x00] [状态字节*4] [CRC] [0xFF 0xFF 0xFF]子类型:固定为
0x00(心跳)状态字节:4 个字节,对应 A–D 四个设备端口
0x00:未连接- 其他值:连接的设备 ID
CRC:对子类型到状态字节累加校验
说明:这样,上位机可定期收到设备连接状态,确保对系统整体情况的可见性。
6. 主程序与线程分工
主程序
- 初始化串口
- 完成一次初始化探测
- 启动探测线程
- 负责设备上报
上位机接收线程
- 接收 UART_MAIN 数据,校验 CRC 并转发至对应设备
设备接收线程
- 接收设备数据并上传
- 更新
last_rx_time - 对 Brain_O2 握手包回复:仅更新
last_rx_time
7. 数据格式说明
7.1 上位机发送数据格式
AA AA AA [数据长度(2B)] [设备ID] [数据] [CRC] FF FF FF
7.2 下行设备数据封包
AA AA AA [数据长度(2B)] [设备ID] [设备数据] [CRC] FF FF FF
7.3 设备状态心跳包格式
AA AA AA 00 06 FF 00 [状态字节*4] CRC FF FF FF
8. 设备特征与探测规则
Brain_O2
- 探测包:
EF EF EF ... FE FE FE - 响应包:24B,前 6B
EF EF EF 11 11 25,后 3BFE FE FE
- 探测包:
Muscle
- 周期性 12B 数据,前 10B 固定
Blood
- 周期性 32B 数据,特征
[0]=FA,[1]=FA,[2]=FA,[7]=00,[8]=17,[29-31]=FB FB FB
- 周期性 32B 数据,特征
BIS
- 周期性 2880B 数据,包含连续三个
0x66
- 周期性 2880B 数据,包含连续三个
9. 功能总结
- 串口多路转发(主机 ↔ 外设)
- 初始化探测 + 热插拔探测
- 设备超时释放与自动重新绑定
- 特殊设备(Brain_O2)保活机制
- 设备状态心跳上报(统一 4 设备状态)
- 上位机与外设的数据帧封装与校验
- 串口名通过 宏定义灵活配置
浙公网安备 33010602011771号