名称 字节数 备注 起始符 1 固定常量 0x68,标识一帧信息的开始 数据帧总长度 2 从(包含)数据帧总长度到(包含)结束符之间的字节数 协议代码 1 1 字节 Hex 码,取值范围 0~255,本协议默认 0x03 协议版本 1 1 字节 Hex 码,取值范围 0~255,当前商用发布版本 0x00 控制字 1 Bit7 指令交互类型,值分为 1 和 0。 1:上行指令,指非民用燃气表向采集系统发出的指令; 0:下行指令,指采集系统向非民用燃气表发出的指令。 Bit6 有后续帧标识,1:有后续帧;0:无后续帧; Bit5 | Bit0 指令控制码,共分为如下几类: 1: 远程通道 2: 本地通道 数据域 n 内容根据控制字和数据标识码而变化 CRC 校验码 2 从(包含)数据帧总长度到(包含)数据域,CRC16 校验 结束符 1 固定常量 0x16,标识一帧的结束,以上是帧格式定义,用C写出函数
时间: 2024-04-10 08:33:06 浏览: 90
以下是一个示例的C语言函数,用于生成符合上述帧格式定义的注册帧上行指令。
```c
#include <stdio.h>
#include <stdint.h>
// 函数声明
void generateRegistrationFrame(uint8_t *frame, uint16_t dataLength, uint8_t controlByte, uint8_t *data);
// 函数实现
void generateRegistrationFrame(uint8_t *frame, uint16_t dataLength, uint8_t controlByte, uint8_t *data) {
// 起始符
frame[0] = 0x68;
// 数据帧总长度
frame[1] = (uint8_t)(dataLength & 0xFF);
frame[2] = (uint8_t)((dataLength >> 8) & 0xFF);
// 协议代码
frame[3] = 0x03;
// 协议版本
frame[4] = 0x00;
// 控制字
frame[5] = controlByte;
// 数据域
for (int i = 0; i < dataLength; i++) {
frame[6 + i] = data[i];
}
// CRC校验码
// 这里省略具体的计算过程
// 结束符
frame[6 + dataLength] = 0x16;
}
int main() {
// 示例用法
uint8_t frame[100]; // 假设注册帧上行指令的最大长度为100字节
// 假设数据域为长度为10的数据
uint8_t data[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
generateRegistrationFrame(frame, 10, 0x80, data);
// 打印生成的注册帧上行指令
for (int i = 0; i < 17; i++) {
printf("0x%02X ", frame[i]);
}
return 0;
}
```
请注意,上述代码只是一个示例,具体的CRC校验码计算过程和数据域内容应根据实际需求进行实现。
阅读全文