以下是一个C语言实现的帧计数判断逻辑代码,根据您的需求分析帧计数状态(正常、误码、丢帧、丢帧+误码)。假设帧计数为3字节(24位)无符号整数:
#include <stdio.h>
#include <stdint.h>
typedef enum {
FRAME_OK, // 与预期一致
FRAME_ERROR, // 误码
FRAME_LOST, // 丢帧
FRAME_LOST_ERROR // 丢帧+误码
} FrameStatus;
FrameStatus check_frame_counter(uint32_t expected, uint32_t received) {
// 情况1:完全匹配
if (expected == received) {
return FRAME_OK;
}
// 计算差异量(考虑24位溢出)
uint32_t diff = (received - expected) & 0x00FFFFFF;
// 情况2:仅误码(差异量不符合任何合理跳变)
if (diff != 1 && diff != 0x00FFFFFE && diff != 0x00FFFFFF) {
return FRAME_ERROR;
}
// 情况3/4:检查是否连续丢帧(允许最大255帧的连续丢失)
uint8_t lost_count = (received - expected - 1) & 0xFF;
if (lost_count <= 255) {
return (diff == (lost_count + 1)) ? FRAME_LOST : FRAME_LOST_ERROR;
}
// 默认视为复杂错误
return FRAME_LOST_ERROR;
}
int main() {
uint32_t expected = 0x000123; // 预期值示例
// 测试用例
uint32_t test_cases[] = {
0x000123, // OK
0x000124, // OK (正常+1)
0x000122, // Error (误码)
0x000125, // Lost (丢1帧)
0x000223, // Lost+Error (丢255帧但值异常)
0xFFFFFF // Overflow case
};
for (int i = 0; i < sizeof(test_cases)/sizeof(uint32_t); i++) {
FrameStatus status = check_frame_counter(expected, test_cases[i]);
printf("Expected: %06X Received: %06X -> ", expected, test_cases[i]);
switch(status) {
case FRAME_OK: printf("Normal\n"); break;
case FRAME_ERROR: printf("Bit Error\n"); break;
case FRAME_LOST: printf("Frame Lost\n"); break;
case FRAME_LOST_ERROR: printf("Lost+Error\n"); break;
}
}
关键逻辑说明:
- 正常情况:严格匹配预期值
- 误码检测:当差异不是±1或合理的连续跳变时判定为误码
- 丢帧检测:
diff=1
:正常下一帧
diff=N+1
:丢失N帧
- 边界处理:
- 24位溢出处理(&0x00FFFFFF)
- 限制最大连续丢帧数(示例设为255)
注意:
- 实际应用中可能需要调整阈值(如最大允许连续丢帧数)
- RTOS环境建议添加互斥锁保护共享变量
- CAN总线等场景需结合错误标志位综合判断
内容由零声教学AI助手提供,问题来源于学员提问