ZBLOG

C中,帧计数存在2种情况:1. 与预期帧计数一致 2.与预期帧计数不一致;与预期帧计数不一致分为3种:1.误码 2.丢帧 3.丢帧+误码,帧计数为3B,请帮我进行写代码寻找判断方法

以下是一个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. 正常情况:严格匹配预期值
  2. 误码检测:当差异不是±1或合理的连续跳变时判定为误码
  3. 丢帧检测
    • diff=1:正常下一帧
    • diff=N+1:丢失N帧
  4. 边界处理
    • 24位溢出处理(&0x00FFFFFF)
    • 限制最大连续丢帧数(示例设为255)

注意:

  • 实际应用中可能需要调整阈值(如最大允许连续丢帧数)
  • RTOS环境建议添加互斥锁保护共享变量
  • CAN总线等场景需结合错误标志位综合判断


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8158

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?