int parse_package(uint8_t *buf, uint32_t size) { int i; protocol_package_t *pk = (protocol_package_t *)buf; uint16_t crc16_calc_value = dataVerificationCRC16(buf, size - 2); uint16_t crc16_package_value = pk->data[pk->len] << 8 | pk->data[pk->len + 1]; printf("----------package---------\r\n"); printf("head:%x\r\n", pk->head); printf("id:%x\r\n", pk->id); printf("func:%x\r\n", pk->function); printf("len:%x\r\n", pk->len); printf("data:"); for(i = 0; i < pk->len; ++i){ printf("%x ", pk->data[i]); } printf("\r\n"); printf("CRC16_package_value:%x\n", pk->data[i] << 8 | pk->data[i + 1]); printf("CRC16_calculate_value:%x\n", crc16_calc_value); if(crc16_calc_value != crc16_package_value){ printf("package_data_error"); return PACKAGE_DATA_ERROR; } if(pk->id >= END_DEVICE_ID){ return PACKAGE_ID_ERROR; } device_control = device_control_function[pk->id]; if(device_control){ return device_control(pk); }else{ return EMPTY_DEVICE_HANDLE_FUNCTION; } //return PACKAGE_OK; }写每一行的注释
时间: 2024-04-23 14:23:13 浏览: 96
php使用parse_url和parse_str解析URL
// 函数的名称为 parse_package,传入参数为指向 uint8_t 类型的指针 buf 和一个 uint32_t 类型的 size
int parse_package(uint8_t *buf, uint32_t size) {
// 定义变量 i,声明并初始化一个 protocol_package_t 结构体指针 pk,使其指向 buf 所指向的地址
int i;
protocol_package_t *pk = (protocol_package_t *)buf;
// 计算 buf 中除去最后两个字节的 CRC16 值,将结果保存到 crc16_calc_value 中
uint16_t crc16_calc_value = dataVerificationCRC16(buf, size - 2);
// 将 buf 中最后两个字节转换为 uint16_t 类型的 CRC16 值,保存到 crc16_package_value 中
uint16_t crc16_package_value = pk->data[pk->len] << 8 | pk->data[pk->len + 1];
// 打印分割线和 package 的头、ID、功能码、长度,并输出 data 数组中的每个元素
printf("----------package---------\r\n");
printf("head:%x\r\n", pk->head);
printf("id:%x\r\n", pk->id);
printf("func:%x\r\n", pk->function);
printf("len:%x\r\n", pk->len);
printf("data:");
for(i = 0; i < pk->len; ++i){
printf("%x ", pk->data[i]);
}
printf("\r\n");
// 输出 CRC16 的计算值和 package 中的值,如果不相等则输出数据错误并返回 PACKAGE_DATA_ERROR
printf("CRC16_package_value:%x\n", pk->data[i] << 8 | pk->data[i + 1]);
printf("CRC16_calculate_value:%x\n", crc16_calc_value);
if(crc16_calc_value != crc16_package_value){
printf("package_data_error");
return PACKAGE_DATA_ERROR;
}
// 如果 package 中的 ID 大于等于 END_DEVICE_ID,则返回 PACKAGE_ID_ERROR
if(pk->id >= END_DEVICE_ID){
return PACKAGE_ID_ERROR;
}
// 根据设备 ID 获取其控制函数,如果存在则执行该函数并返回其返回值,否则返回 EMPTY_DEVICE_HANDLE_FUNCTION
device_control = device_control_function[pk->id];
if(device_control){
return device_control(pk);
}else{
return EMPTY_DEVICE_HANDLE_FUNCTION;
}
//return PACKAGE_OK;
}
阅读全文