device_control = device_control_function[pk->id]; if(device_control){ return device_control(pk); }else{ return EMPTY_DEVICE_HANDLE_FUNCTION; }
时间: 2024-04-23 11:23:37 浏览: 51
这段代码的作用是根据收到的协议数据包中的ID值选择相应的设备控制函数,并执行该函数。函数首先根据ID值从device_control_function数组中选择相应的设备控制函数,并将其赋值给device_control变量。然后,它检查device_control变量是否为NULL,如果不是NULL,则调用该函数并将收到的协议数据包作为参数传递给它。如果device_control为NULL,则返回EMPTY_DEVICE_HANDLE_FUNCTION。
相关问题
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; }写每一行的注释
// 函数的名称为 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;
}
int temperature_humidity_device_control(protocol_package_t *pk) //void func_1() { int i = 0; // for(i = 0; i < 4; ++i){ uint8_t temperature = 1 ; uint8_t humidity = 1; uint8_t aTXbuf[32] ; printf("TEM_HUM_device\n"); if(pk->function == 0x16 && pk->data[0] == 0x0){ // while(1){ for(i = 0; i < 4; ++i){ printf("TEM_HUM_SUCCESS\n"); DHT11_Read_Data(&temperature , &humidity); sprintf((char*)aTXbuf,"%d , %d %% \r\n" ,temperature ,humidity); HAL_UART_Transmit(&huart1, aTXbuf, strlen((const char*)aTXbuf), 200); HAL_Delay(2000); } pk->len = 0x4; pk->data[0] = 0x35; pk->data[1] = temperature; pk->data[2] = humidity; }else{ printf("TEM_HUM_ERROR\n"); pk->data[0] = 0x36; } //} return 0; }改错
这段代码有一些问题:
1. 在函数开头的注释中出现了一个未定义的函数名 "func_1()",如果不需要这个函数,建议将这个注释删除。
2. 变量 i 在 for 循环中被定义,但是在循环外也被定义了一次,这样会导致编译错误。建议将 for 循环中的 i 声明放到循环外。
3. 在函数中有一个 while(1) 的注释,但是没有相应的代码实现,如果不需要这个死循环,建议将这个注释删除。
4. 在 DHT11_Read_Data 函数中读取的温度和湿度值没有进行错误检查,建议在函数调用之后对返回值进行检查,如果返回错误,可以设置一个默认值或者进行其他的错误处理。
修改后的代码如下所示:
```
int temperature_humidity_device_control(protocol_package_t *pk) {
uint8_t temperature = 0;
uint8_t humidity = 0;
uint8_t aTXbuf[32];
printf("TEM_HUM_device\n");
if (pk->function == 0x16 && pk->data[0] == 0x0) {
for (int i = 0; i < 4; ++i) {
printf("TEM_HUM_SUCCESS\n");
if (DHT11_Read_Data(&temperature, &humidity) != SUCCESS) {
temperature = 0;
humidity = 0;
}
sprintf((char*)aTXbuf, "%d , %d %% \r\n", temperature, humidity);
HAL_UART_Transmit(&huart1, aTXbuf, strlen((const char*)aTXbuf), 200);
HAL_Delay(2000);
}
pk->len = 0x4;
pk->data[0] = 0x35;
pk->data[1] = temperature;
pk->data[2] = humidity;
} else {
printf("TEM_HUM_ERROR\n");
pk->data[0] = 0x36;
}
return 0;
}
```