⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recfunction.c

📁 指纹通讯模块程序
💻 C
字号:

#include <stdio.h>
#include <reg51.h>

extern bit  PacketValue ;         // 0 没有带参数的包  1 带参数的包
extern unsigned char PacketID   ;   //包标识
extern unsigned char PacketData ;   //包内容
extern bit  revSuccess ;            // 0 没接收成功  1 接收成功
extern unsigned char PacketMessage[10]; // 指向数据包内容参数的指针 // 因为参数的长度是不定的所以用指针而不能用数组
extern unsigned char MessageLength ; //参数的长度

extern unsigned char SendPacket[5] ;

unsigned char Num=0;
unsigned char Cont=0;

unsigned char revChar;
unsigned char PacketLength[2];
unsigned char test[4];

bit RevAddress=0;
bit RevHead=0;
bit checkHighWord=0;
bit revPacketLength=0;

unsigned int  checksum=0;
unsigned int  k=0;
unsigned char m=0;

void revFunction(void) interrupt 4 using 2
{

    if(RI==1)
      {
           RI=0;
           revChar=SBUF;

           Num++;
           if((Num==1) && (revChar==0x0EF))
                  RevHead=1;
           if((Num==2) && (revChar==0x01) && (RevHead==1))//检测包头:0xFF01
                  Cont++;
           if((Num==3) && (revChar==0xFF) && (RevHead==1))//检测模块地址 0xFF FF FF FF
                  Cont++;
           if((Num==4) && (revChar==0xFF) && (RevHead==1))
                  Cont++;
           if((Num==5) && (revChar==0xFF) && (RevHead==1))
                  Cont++;
           if((Num==6) && (revChar==0xFF))
            {
                 if(Cont==4)
                  {
                    Cont=0;
                    RevAddress=1;
                  }
                 else
                  {
                    Cont=0;
                    RevAddress=0;
                  }
             }
           if((Num==7) && (RevAddress==1))          // 收到有效地址
                  {
                     PacketID=revChar;              // 检测包标识
                     checksum+=(int)revChar;
                  }
           if((Num==8) && (RevAddress==1))         //PacketLength[0]放LENGTH的高字节                                                   //PacketLength[0]放LENGTH的高字节
                  {
                     PacketLength[Num-8]=revChar;   //检测包长度的高字节
                     checksum+=(int)revChar;
                  }
           if((Num==9) && (RevAddress==1))
                  {
                     PacketLength[Num-8]=revChar;   //检测包长度的低字节
                      m=PacketLength[1];
                     checksum+=(int)revChar;
                     revPacketLength=1 ;
                     RevAddress=0;
                  }
           if((Num==10) && (revPacketLength==1))          //接收应答包的确认码
              {
                     PacketData=revChar ;
                     checksum+=(int)revChar;
              }

           if((Num>10) && (PacketLength[1]>0x03) && (revPacketLength==1))  //获取应答包的参数
              {
                   k=checksum;
                   MessageLength=PacketLength[1]-3;       //应答包参数的长度(包长度减去2字节 的效验位和1字节的确认码

                   PacketMessage[Num-11]=revChar;
                                                    //获取包的内容的参数
                   test[Num-11]=revChar  ;

                   checksum+=(int)revChar;
                   PacketValue =1;                       //带参数的包做标记
              }
           if((Num==8+PacketLength[1]) && ( revPacketLength==1))           //校验
              {
                     k= checksum ;

                  if(checksum/256==revChar)             //进行高字节效验

                     checkHighWord=1;                   //高字节效验成功
                   else
                     checkHighWord=0;                  //高字节效验失败
              }
           if((Num==m+8+1) && (revPacketLength==1))                //低字节校验
              {
                        checksum=k;

                     if((checksum%256==revChar) &&  (checkHighWord==1))
                         {
                            revSuccess=1;             //效验成功
                         }
                     else
                         {
                            revSuccess=0;             //效验失败
                         }
                    ES=0;
                    Num=0;
                    checksum=0x0000;
                    checkHighWord=0;
                    revPacketLength=0;
             }                            //EF 01 FF FF FF FF 07 00 03 00 00 0A
        }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -