case kStatus_Data: RxPkt->buf[RxPkt->ofs++] = c; if(RxPkt->type == 0xA7 && RxPkt->ofs >= 8) { RxPkt->payload_len = 8; EventHandler(RxPkt); status = kStatus_Idle; } if(RxPkt->ofs >= MAX_PACKET_LEN) { status = kStatus_Idle; return CH_ERR; } if(RxPkt->ofs >= RxPkt->payload_len && RxPkt->type == 0xA5) { /* calculate CRC */ crc16_update(&CRCCalculated, crc_header, 4); crc16_update(&CRCCalculated, RxPkt->buf, RxPkt->ofs); /* CRC match */ if(CRCCalculated == CRCReceived) { EventHandler(RxPkt); } status = kStatus_Idle; } break; default: status = kStatus_Idle; break; } return CH_OK; } #if defined(__cplusplus) } #endif
时间: 2024-02-10 09:07:36 浏览: 138
这段代码看起来像是一个UART通信协议的接收函数,根据接收到的字节不同,会进入不同的状态处理。其中,如果接收到的是数据类型(0xA7),并且接收到的字节数已经达到8个,那么会触发一个事件处理函数。如果接收到的是有效负载类型(0xA5),并且接收到的字节数已经达到指定的负载长度,那么会计算CRC校验,如果校验通过则也会触发一个事件处理函数。最后,无论是哪种类型,如果接收到的字节数超过了最大包长度,就会重置状态并返回错误。
阅读全文