2 botao258 botao258 于 2015.07.16 13:26 提问

C51串口中断接收多字节数据,并解析数据,问题是不能解析,哪错了?

#include

#include
#include
#define uchar unsigned char
#define uint unsigned int

uchar code SZDLJ[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};//AT+CIPMUX=1
uchar code KQFU[21]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,0x31,0x2C,0x38,0x30,0x38,0x30,0x0D,0x0A};//AT+CIPSERVER=1,8080

uint URTAReceivedCount=0,n=1; //用于串口中断子函数中计数
uchar data Tempdatatable[5],CommandDatatable[5]; //定义临时数组和用于调用控制动作的数组

/*****************************************************
函数功能:延时若1ms
*******************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}

/*****************************************************
函数:往串口发送数据
功能:只用于设定wifi模块
***************************************************/
void SendData(uchar *sdata,int num)
{
int i;
for(i=0;i<num;i++)
{
SBUF=sdata[i];
Delay_1ms(2);
}
}

/********************************************************************

  • 函数 :Moto_Forward()
  • 功能 :前进 ***********************************************************************/ void Moto_Forward() {
    P1= 0x0a; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_Backward()
  • 功能 :后退 ***********************************************************************/ void Moto_Backward() { P1= 0x05; Delay_1ms(100); }

/********************************************************************

  • 函数 :Moto_TurnLeft()
  • 功能 :左转 ***********************************************************************/ void Moto_TurnLeft() { P1= 0x09; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_TurnRight()
  • 功能 :右转 ***********************************************************************/ void Moto_TurnRight() { P1= 0x06; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_Stop()
  • 功能 :停止 ***********************************************************************/ void Moto_Stop() { P1= 0x00; Delay_1ms(100); }

/****************************************************************************
函数:主函数
功能:初始化串口,并从串口发送指令到wifi模块用于设置模块,再使能中断,
再进入while循环,解析从串口收到的数据
*****************************************************************************/
void main(void)
{

Delay_1ms(3000);

TMOD=0x21;  //TMOD=0010 0001B,定时器T1工作于方式2 

SCON=0x50; //SCON=0101 0000B,串口工作方式1 1起始位8数据位1停止位
PCON=0x00; //PCON=0000 0000B,波特率9600 晶振11.0592
TH1=0xFd; //根据规定给定时器T1赋初值
TL1=0xFd; //根据规定给定时器T1赋初值
TR1=1; //启动定时器T1

SendData(SZDLJ,13);  //设置多连
Delay_1ms(3000);

SendData(KQFU,21);   //开启server端
Delay_1ms(8000);

ES = 1;     //串口中断使能

EA = 1; //开总中断

while(1)  //一直循环直到中断产生,跳进中断执行中断子函数,完后再回到循环并解析数据,等待下次中断到来
    {
        if(CommandDatatable[0]==0xFF&&CommandDatatable[4]==0XFF)
        {
            switch(CommandDatatable[1])
            {
                case 0x00:
                    switch(CommandDatatable[2])
                    {
                            case 0X00:Moto_Stop();break;
            case 0X01:Moto_Forward();break;
            case 0X02:Moto_Backward();break;
            case 0X03:Moto_TurnLeft();break;
            case 0X04:Moto_TurnRight();break; 
                          default :  break;
          }
                default: break;
    }
  }
}

}

/*****************************************************************************
函数:串口中断子函数
功能:接收串口数据,组包成类 “0XFF 0X00 0X01 0X02 0XFF” 的数组,用于主函数解析,包头和包尾都是0XFF,的5元数组
******************************************************************************/
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0;
RI=0;
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]==0XFF;
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}

if(URTAReceivedCount==2)
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0;

temp="";
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];

ES=1;
}

串口助手给MCU发16进制类似“FF 00 01 02 FF”数时,不能正确解析

1个回答

leizhang250
leizhang250   2015.07.17 08:27

void Com_Int(void) interrupt 4
{
uchar temp;
ES=0;
RI=0;
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
_Tempdatatable[0]==0XFF; 此行代码的“==肯定是不对的应该为"="

Csdn user default icon
上传中...
上传图片
插入图片