使用状态机完成ID卡曼彻斯特解码

一、什么是曼彻斯特编码?
曼彻斯特是一种不归零的编码方式,在信号位中电平从低到高跳变表示1,在信号位中电平从高到低跳变表示0。
注:编码速率为载波速率的一半
二、ID卡卡号(EM4100的数据格式)
使用状态机完成ID卡曼彻斯特解码_第1张图片
由图可见,卡号前九位全为1,从第二行每行就行行校验,列进行列校验。
三、C语言状态机
主要有由事件和状态构成,由事件驱动状态。

                     |           |-------->执行动作action

 发生事件 ----->| cur_state |

                     |           |-------->设置下一状态号nxt_state

                     -------------

                        当前状态

                  图1 有限状态机工作原理
                  --------------------------------------------

四、程序
思路:step0:先检测帧头(即为9个1);
step1:执行下一步接收数据并进行行校验直到接收完50个数据,否则返回step0;
step2:检测最后一个数是否为0,:再进行列的奇偶校验;否则返回step0;

 char manchesterDecodeFast(uint8_t newState, uint8_t isReset)
 {
     switch(step) {
     case 0:
           //检测头
           headerCnt += newState;
           if (headerCnt >= 9) {   //j检测帧头的9个1
               headerCnt = 0;
               rcvCnt    = 0;
               step = 1;
           }
           if(newState == 0) {
           headerCnt = 0;
           }
           break;
           
     case 1:
           //接收数据
           bitStreamDecode[rcvCnt] = newState;
           Cnt++;  //代表第几位数据
           if((Cnt % 5) == 0) {  //校验
              onecnt = 0;
              for (i = 0; i < 4; i++) {
                 onecnt += bitStreamDecode[Cnt-5+i];
              }
              if( ((onecnt%2) == bitStreamDecode[Cnt-1])  || ((onecnt%2) == bitStreamDecode[Cnt-1]) {
                 //进行奇偶校验,校验通过
              } else {       //校验不通过
                headerCnt = 0;
                step = 0;
                break;
              }
           }
           if(Cnt >= 50) {  //接收完所有数据
                rcvColCnt = 0;
                step = 2;
           }
       break;
       
     case 2:     //接收列校验和结束附
        bitStreamDecode[50+rColCnt] = newState;
        rcvColCnt++;
        if(rcvColCnt >= 5) {
                if(newState) {
                    headerCnt = 0;
                    step = 0;
                    break;
                }
                
              //列校验
               for (j = 0; j<4; j++) {
                   onecnt = 0;
                   for (i = 0; i < 10; i++) {
                     onecnt += bitStreamDecode[j+i*5];
                   }
                   if( ((onecnt%2) == bitStreamDecode[j+50])  || ((onecnt%2) == bitStreamDecode[j+50]) {
                       //校验通过
                      
                    } else {
                      //列校验失败
                       headerCnt = 0;
                       step = 0;
                       break;
                    }
               }
                headerCnt = 0;
                step = 0;
                return 1;
        }
       break;
 }

你可能感兴趣的:(C语言)