跳到主要内容

API 参考

OSynaptic-RX 提供五个头文件模块。新项目推荐从 osrx_sensor.h 入手。


osrx_sensor.h — 一体化解码(推荐)

osrx_sensor_recv()

int osrx_sensor_recv(const osrx_u8        *packet,
int len,
osrx_packet_meta *meta,
osrx_sensor_field *field);

一次调用完成头部 + body 解码并校验两个 CRC。

参数方向描述
packet输入来自传输层的原始帧字节
len输入packet 的字节数
meta输出解码后的头部字段;始终在返回时填充
field输出解码后的传感器字段;仅返回值非零时填充

返回值: 完全成功(结构解析 + 两个 CRC 均通过)返回 1,否则返回 0

meta->crc8_okmeta->crc16_ok 独立设置。返回 0 时若仅 CRC-16 失败,CRC-8 仍可能有效(反之亦然)。

osrx_sensor_unpack()

int osrx_sensor_unpack(const osrx_u8     *body,
int body_len,
osrx_sensor_field *out);

仅将 body 片段 "sid|unit|b62" 解析为 osrx_sensor_field(不解码头部,不校验 CRC)。


osrx_parser.h — 流式字节累积器

OSRXParser 结构体

typedef struct {
osrx_u8 buf[OSRX_PACKET_MAX]; /* 累积缓冲区 */
int len; /* 已累积字节数 */
osrx_frame_cb fn; /* 用户回调 */
void *ctx; /* 用户上下文指针 */
} OSRXParser;

默认 OSRX_PACKET_MAX=96 时 RAM 占用:102 字节

函数列表

函数签名描述
osrx_parser_init(OSRXParser *p, osrx_frame_cb cb, void *ctx)初始化解析器,注册回调
osrx_feed_byte(OSRXParser *p, osrx_u8 b) → int推入一个字节。溢出/重置时返回 0,否则返回 1
osrx_feed_done(OSRXParser *p) → int标志帧结束;解析并调用回调。结构有效返回 1
osrx_feed_bytes(OSRXParser *p, const osrx_u8 *data, int len) → int一次性喂入所有字节并调用 osrx_feed_done
osrx_parser_reset(OSRXParser *p)丢弃已累积字节,不解析

回调函数签名

typedef void (*osrx_frame_cb)(
const osrx_packet_meta *meta, /* 头部字段,始终有效 */
const osrx_sensor_field *field, /* 传感器字段;非传感器帧为 NULL */
const osrx_u8 *raw, /* 原始帧字节 */
int raw_len,
void *ctx /* 来自 osrx_parser_init() 的用户上下文 */
);

osrx_packet.h — 仅解码头部

int osrx_packet_decode(const osrx_u8    *packet,
int len,
osrx_packet_meta *out);

仅解码 13 字节头部。不解析 body,不校验 CRC。适用于仅需要 aidtidts_sec 的场景。


osrx_b62.h — Base62 解码器

int osrx_b62_decode(const char *s, osrx_i32 *out);

将 Base62 字符串解码为有符号 32 位整数。成功返回 1,无效字符返回 0


osrx_crc.h — CRC 工具函数

osrx_u8  osrx_crc8 (const osrx_u8 *data, int len, osrx_u8  poly, osrx_u8  init);
osrx_u16 osrx_crc16(const osrx_u8 *data, int len, osrx_u16 poly, osrx_u16 init);

通用逐位 CRC 计算。通常无需直接调用——osrx_sensor_recv() 内部已处理。