| 
 
| 原来在Keil 3环境下选择AT89S8253作为器件,编写了一段程序。在Keil 环境下用纯软件仿真,判断逻辑都没有错。串口能够按照要求输出自己定义好的观测字符。<br />但是下载到AT89S8253以后,发现以下问题:<br />1.串口输出的第一个字符是正确的以后,后面接着所有字符都错误。<br />2. 必须在Small模式下编译,在Compact模式和Large模式下编译的程序都不允许,串口无任何字符输出。<br />---------------------<br />我采取了以下措施,问题依旧:<br />1. 将串口波特率降低到9600。<br />2. 换掉目标板上的AT89S8253,重新焊接新的。<br />3. 将我程序中的“消息队列“相关函数去除,串口输出即可正确。<br />4. 换用陈明计老师的SmallRTOS的编写,软件仿真都正确,串口能够可以看到数据,但是下载之后无反应!<br />我的疑问:<br />1. 消息队列相关函数,我已经用Keil C里面纯软件仿真一步一步的调试过。逻辑没有问题!是否编译器参数设置问题?<br />2. 是否是软件代码问题?<br /><br /><br />我的编写的代码如下附件,请大家帮我找找原因!<br /><br />#include "config_all.h"<br />uint8 Uart_ReceFrame_State=0;            //定义一个表示串口接收数据帧状态的变量,标明有没有接收到起始字符,帧长度,数据,校验字等状态<br /><br />extern void Delay_50us(uint16 t);<br />#define MCU_SerialInData_FIFO_MaxNumber        30<br />#define MCU_SerialOutData_FIFO_MaxNumber    30<br />#define System_Message_FIFO_MaxNumber    10<br /><br />uint8 xdata MCU_SerialInData_FIFO[MCU_SerialInData_FIFO_MaxNumber];            //定义存储PDA下发下来的数据的数组,[0]为存储数组中有效数据的长度,<br />uint8 xdata MCU_SerialOutData_FIFO[MCU_SerialOutData_FIFO_MaxNumber];<br />uint8 xdata System_Message_FIFO[System_Message_FIFO_MaxNumber];<br /><br /><br />uint8 xdata  Uart1_Datain_buffer[30];                /*定义子串口1接收PDA命令缓冲存储数组*/<br />uint8 xdata  Uart2_Datain_buffer[30];                /*定义子串口2接收PDA命令缓冲存储数组*/<br />uint8 xdata  Uart3_Datain_buffer[30];                /*定义子串口3接收PDA命令缓冲存储数组*/<br />uint8 xdata  Uart4_Datain_buffer[30];                /*定义子串口4接收PDA命令缓冲存储数组*/<br /><br /><br /> uint8  Test_Stop=0;<br /> uint8   Have_Right_Frame=0;<br /><br /><br />#define All_Frame_data_number 40<br />uint8 xdata  All_Frame_data[All_Frame_data_number];        //存储串口接收到得数据,保留的是一个完整的帧,方便以后计算<br />uint8 xdata  PDA_Command[40];        //存储串口接收到得数据,保留的是一个完整的帧,方便以后计算<br />uint8  Frame_Data_number1,Frame_Data_number2;    /*定义接收串口命令帧长度标识字符,通讯协议中的帧长度信息存入此变量*/<br />uint8  Frame_Data_Number_Flag;            //定义帧数据字节的长度,准备在接受帧数据中作为计数器使用<br />uint8  CRC_16_Number;<br />uint16 CRC_16_Result_Receiver;<br />uint16 CRC_16_Result_Change;<br /><br />uint8 xdata MCU_SerialPort_CanSend;<br /><br /><br /><br /><br />extern void VK3234_UartOut(uint8 xdata  *Buf);<br />/*********************************************************************************************************<br />** 函数名称: void InitSerial(void)<br />** 功能描述: 串口0初始化<br />** 输 入: <br />** 输 出: <br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />        void InitSerial(void)<br />{<br />    SCON = 0x50;<br />    PCON = 0x00;                //波特率加倍<br />    TMOD = TMOD & 0x0f;<br />    TMOD = TMOD | 0x20;                    //工作于方式2,自动重装<br />    TH1 = 0xfD;                       //串口通信的波特率是 9600 b/s<br />    TL1 = 0xfD;<br /><br />    //TH1=BAUDRATE;<br />    //TL1=BAUDRATE;<br />    TR1 = 1;<br />    ES = 1;<br /> <br />}<br /><br /><br />/*********************************************************************************************************<br />** 函数名称: CreateMessagePool(uint8 xdata *Buf,uint8 SizeOfBuf)<br />** 功能描述: 建立一个环形的消息管理队列,并且进行初始化<br />** 输 入: <br />** 输 出: <br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />uint8  CreateMessagePool(uint8 xdata  *Buf,uint8  SizeOfBuf)<br />{<br />    uint8 a=0xff;<br />    if((SizeOfBuf>4)&&(Buf!=NULL))<br />    {<br />    Disable_MCU_Interrupt();<br />    Buf[0]=0;                //标识消息环中有用消息的个数;<br />    Buf[1]=SizeOfBuf;        //标识消息队列最大可以存储多少个消息,Buf[1]以后固定不变,便于以后比较操作<br />    Buf[2]=3;                //存储真正存放有效消息的数组下标,指明哪一个数组值是要出消息对的<br />    Buf[3]=0;                //存放消息的的真正起始地址,这里存储第一个消息。<br />    Enable_MCU_Interrupt();<br />    a=Ture;<br />    } <br />    else<br />    {<br />    a=False;<br />    }<br />    return a;<br />}<br />/*********************************************************************************************************<br />** 函数名称: PostMessagePool(uint8  *Buf,uint8 Data)<br />** 功能描述: 将一个消息放入消息队列<br />** 输 入: <br />** 输 出: <br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /> uint8 PostMessagePool(uint8 xdata  *Buf,uint8 data Data)<br />{<br />    uint8 temp=0;<br /><br />    if(Buf==NULL)<br />    {<br />        return False;<br />    }<br />    Disable_MCU_Interrupt();<br />    if(Buf[0]<(Buf[1]-3))    //判断消息队列中是否还有空间<br />    {<br />        temp=Buf[2]+Buf[0];    //Buf[2]是当前第一个消息的存储位置+Buf[0]当前还有几个有效消息+1<br />        if(temp>=Buf[1])        //判断存放的地址是否超过了消息最后一个存储位置(越界)<br />        {<br />            temp=temp-Buf[1]+3;    //存储地址越界了,则存放在消息环的第一个位置,形成环形<br />        }<br />        Buf[temp]=Data;            //存储消息值<br />        Buf[0]++;                //标识消息环中有用消息的个数加1<br />        Enable_MCU_Interrupt();<br />        return Ture;<br />    }<br />    else<br />    {<br />           Enable_MCU_Interrupt();<br />        return False;<br />    }<br />}<br />/*********************************************************************************************************<br />** 函数名称: uint8 PostMessagePool_Interrupt(uint8  *Buf,uint8 Data)<br />** 功能描述: 中断程序中使用,将一个消息放入消息队列,<br />** 输 入: <br />** 输 出: <br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /> uint8 PostMessagePool_Interrupt(uint8 xdata  *Buf,uint8 data Data)<br />{<br />    uint8 temp=0;<br /><br />    if(Buf==NULL)<br />    {<br />        return False;<br />    }<br />    Disable_MCU_Interrupt();<br />    if(Buf[0]<(Buf[1]-3))    //判断消息队列中是否还有空间<br />    {<br />        temp=Buf[2]+Buf[0];    //Buf[2]是当前第一个消息的存储位置+Buf[0]当前还有几个有效消息+1<br />        if(temp>=Buf[1])        //判断存放的地址是否超过了消息最后一个存储位置(越界)<br />        {<br />            temp=temp-Buf[1]+3;    //存储地址越界了,则存放在消息环的第一个位置,形成环形<br />        }<br />        Buf[temp]=Data;            //存储消息值<br />        Buf[0]++;                //标识消息环中有用消息的个数加1<br />        Enable_MCU_Interrupt();<br />        return Ture;<br />    }<br />    else<br />    {<br />           Enable_MCU_Interrupt();<br />        return False;<br />    }<br />}<br /><br />/*********************************************************************************************************<br />** 函数名称: GetMessagePool(uint8  *Buf,uint8 Data)<br />** 功能描述: 从指定的消息队列取出一个消息<br />** 输 入: <br />** 输 出:     调用成功,返回Ture,调用失败返回False<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />    uint8 GetMessagePool(uint8 xdata  *Buf,uint8 data *Data)<br />{<br /><br />    if(Buf==NULL)<br />    {<br />        return False;<br />    }<br />    Disable_MCU_Interrupt();<br />    if(Buf[0]!=0)<br />    {<br /><br />        *Data=Buf[Buf[2]];<br /><br />        Buf[0]--;    //标识消息环中有用消息的个数减1<br />        Buf[2]++;    //出对的消息指针加1,指向下一个消息<br />        if(Buf[2]>=Buf[1])<br />        {<br />            Buf[2]=3;<br /><br />        }<br />    <br />        Enable_MCU_Interrupt();<br />        return Ture;<br />    }<br />    else<br />    {<br />           Enable_MCU_Interrupt();<br />        return False;    <br />    }<br />}     <br /><br /><br /><br />/*********************************************************************************************************<br />** 函数名称:uint8 GetMessageNumber(uint8  *Buf)<br />** 功能描述: 查询消息队列的消息个数<br />** 输 入: <br />** 输 出:     返回消息个数<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />    uint8 GetMessageNumber(uint8 xdata  *Buf)<br />{<br />    uint8 temp;<br />    if(Buf==NULL)<br />    {<br />        return False;<br />    }<br /><br />    if(Buf[0]!=0)<br />    {<br />        temp=Buf[0];<br />           Enable_MCU_Interrupt();<br />        return temp;<br />    }<br />    else<br />    {<br /><br />        return 0;<br />    }<br />}     <br /><br />/*********************************************************************************************************<br />** 函数名称:uint8 ClearMessagePool(uint8  *Buf)<br />** 功能描述: 清空消息队列<br />** 输 入: <br />** 输 出:     返回消息个数<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />    uint8 ClearMessagePool(uint8 xdata  *Buf)<br />{<br />    if(Buf==NULL)<br />    {<br />        return False;<br />    }<br /><br />    Buf[0]=0;                //标识消息环中有用消息的个数;<br />//    Buf[1]=SizeOfBuf;        //标识消息队列最大可以存储多少个消息,Buf[1]以后固定不变,便于以后比较操作<br />    Buf[2]=3;                //存储真正存放有效消息的数组下标,指明哪一个数组值是要出消息对的<br />    Buf[3]=0;                //存放消息的的真正起始地址,这里存储第一个消息。<br />    return Ture;<br />}     <br /><br /><br /><br />/*********************************************************************************************************<br />** 函数名称: PutChar<br />** 功能描述: 发送一个字节<br />** 输 入: Data:发送的数据<br />** 输 出: 无<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />   void PutChar(uint8 data Data)<br />{<br />       Disable_MCU_Interrupt();<br />    if (MCU_SerialPort_CanSend == Ture)                         <br />    {<br />        MCU_SerialPort_CanSend = False;<br />        SBUF = Data;                                /* 串口空闲,直接发送   */<br />  }<br />    else<br />    {<br />       PostMessagePool(MCU_SerialOutData_FIFO,Data);;             /* 数据入队             */<br />    }<br />           Enable_MCU_Interrupt();<br />}  <br /><br /><br /><br />/*********************************************************************************************************<br />** 函数名称: comm<br />** 功能描述: 串口中断处理程序<br />** 输 入: 无<br />** 输 出: 无<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年3月12日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /><br />        void comm(void) interrupt 4<br />{<br />    uint8 data temp;<br />//    uint8 data temp1;<br />    EA=0;<br />    if (RI == 1)        //这句适用于普通C51单片机<br />    {<br />        RI = 0;<br />        temp=SBUF;<br />        PostMessagePool_Interrupt(MCU_SerialInData_FIFO,temp);<br /><br /><br />    }<br />    if (TI == 1)<br />    {<br />        TI = 0;<br />       // if(GetMessageNumber(MCU_SerialOutData_FIFO)!=False)    //如果串口接收缓冲区有数据<br />    //    {<br />        //    if(    GetMessagePool(MCU_SerialOutData_FIFO,&temp1)==Ture)<br />        //    {<br />        //    SBUF=temp1;<br />        //    }<br />    <br />    //    }<br />        //else <br />        //{<br />    //    MCU_SerialPort_CanSend=Ture;<br />    //    }<br />    }<br />    EA=1;<br />    return;<br /><br />}<br />/*********************************************************************************************************;<br />** 函数名称: uint8 Frame_DataLengthNumber_ChangeFromat2(uint8 a1, uint8 a2)<br />** 功能描述: 解析上位机发送的命令中帧长度字符代表的长度<br />** 输 入: 帧长度字符1和帧长度字符2<br />** 输 出: 帧长度<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年5月3日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /><br />void Frame_DataLengthNumber_ChangeFromat2(void)<br /><br />{ <br />    if((Frame_Data_number1>=0)&&(Frame_Data_number1<10))<br />    {<br />    Frame_Data_number1=    Frame_Data_number1+Frame_Data_number1+Frame_Data_number1+Frame_Data_number1+Frame_Data_number1+<br />                        Frame_Data_number1+Frame_Data_number1+Frame_Data_number1+Frame_Data_number1+Frame_Data_number1;<br /><br /><br />    }<br />    Frame_Data_number2=Frame_Data_number1+Frame_Data_number2;<br />   //return Frame_Data_number2;<br />  }<br /><br /><br />/*********************************************************************************************************;<br />** 函数名称: uint16 cal_crc(uint8 cHar *ptr, uint8  len)   <br />** 功能描述: 计算CRC16的算法<br />** 输 入: 计算字符串地址,字符长度<br />** 输 出: CRC16计算结果<br />** 全局变量: 无<br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年5月3日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /><br /><br />uint16 Cal_CRC(uint8 xdata *ptr, uint8  len)    <br />{    <br />uint8   i;    <br />uint16  crc_value =0;    <br />while(len--)<br />     {<br />    for(i=0x80; i!=0; i>>=1 )<br />       {    <br />            if (crc_value&0x8000) <br />            crc_value = (crc_value << 1) ^0x8005 ;<br />            else<br />            crc_value = crc_value << 1 ;<br />            if(*ptr&i)<br />            crc_value^=0x8005 ;    <br />        }<br />    ptr++;<br />    }    <br />return(crc_value);    <br />}<br /><br /><br />/*********************************************************************************************************;<br />** 函数名称: uint8 Faylse_Uart_Frame(uint8 Data)<br />** 功能描述: 串口接收帧数据帧分析<br />** 输 入:     <br />** 输 出: <br />** 全局变量: <br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年5月3日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br /><br />void Faylse_Uart_Frame(void)<br />{    <br />    uint8 temp;<br /><br />    for(temp=0;temp<40;temp++)<br />        {<br />        PDA_Command[temp]=0;                //PDA_Command[0]包含了命令字1个字节的长度+ 真正有效数据的长度<br />        }<br />    PDA_Command[0]=Frame_Data_number2;        //PDA_Command[0]保存着帧数据长度,这长度包含了转义字符的长度,实际使用的时候要转换<br />    if(All_Frame_data[3]==1)                //数据发往子串口1<br />        {<br />        PDA_Command[1]=1;<br />        }<br />    <br />    else if(All_Frame_data[3]==2)            //数据发往子串口2<br />        {<br />        PDA_Command[1]=2;<br />        }<br />    else if(All_Frame_data[3]==3)            //数据发往子串口3<br />        {<br />        PDA_Command[1]=3;<br />        }    <br />    else if(All_Frame_data[3]==4)            //数据发往子串口4<br />        {<br />        PDA_Command[1]=4;<br />        }<br />    for(temp=0;temp<Frame_Data_number2-1;temp++)    //取出缓冲数组的值,并且分析专业字符,重新计算字节的长度<br />        {<br />         if(All_Frame_data[3+2+temp]==Uart_ReceFrame_StartByte2)<br />            {<br />                 if(All_Frame_data[3+2+1+temp]==Uart_ReceFrame_StartByte2)<br />                    {<br />                     PDA_Command[temp+2]=0x56;<br />                     PDA_Command[0]--;<br />                     temp++;<br />                    }<br />                else if(All_Frame_data[3+2+1+temp]==Uart_ReceFrame_StartByte3)<br />                    {<br />                     PDA_Command[temp+2]=0x57;<br />                    PDA_Command[0]--;<br />                     temp++;<br />                    }    <br />            }<br />         else<br />            {<br />                     PDA_Command[temp+2]=All_Frame_data[3+1+temp];            <br />            }<br />        }<br />                PDA_Command[0]--;            //减去命令字节的1个字节长度,剩下数值只表示要发送到串口数据的字节数            <br />        <br />}<br /><br /><br /><br /><br /><br /><br />/*********************************************************************************************************;<br />** 函数名称: void Detet_Receiver()<br />** 功能描述: 检测串口状态,等待接收到一个完整的有效的帧,发送消息到系统消息队列<br />** 输 入:     <br />** 输 出: <br />** 全局变量: <br />** 调用模块: 无<br />**<br />** 作 者: LXJ<br />** 日 期: 2009年5月3日<br />**-------------------------------------------------------------------------------------------------------<br />** 修改人:<br />** 日 期:<br />**------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />void Detet_Receiver()<br />    {<br /><br />        uint8 data temp1;<br /><br />        uint16    CRC_Result_temp=0;<br /><br />        if(GetMessageNumber(MCU_SerialInData_FIFO)!=False)    //如果串口接收缓冲区有数据<br />        {<br />            if(    GetMessagePool(MCU_SerialInData_FIFO,&temp1)==Ture)        //假如取值成功<br />                {    <br />                    switch(Uart_ReceFrame_State)<br />                    {<br />                     case Uart_Dete_Frame_InitState:<br />    <br />                                    if(temp1==Uart_ReceFrame_StartByte1)                //判断是否是帧起始字符0x55<br />                                            {<br />                                                Uart_ReceFrame_State=Uart_Dete_Frame_StartByte_End;//标明串口已经接收到帧起始字符<br />                                                All_Frame_data[0]=0x55;                //存储帧起始字符<br />                                             }<br />                                    else<br />                                            {<br />                                                 Uart_ReceFrame_State=Uart_Dete_Frame_InitState;<br />                                                Frame_Data_Number_Flag=0;<br />                                                Frame_Data_number2=0;<br />                                            }<br /><br />                                    break;<br />                    case Uart_Dete_Frame_StartByte_End:<br />                                    {<br />                                        Frame_Data_number1=temp1;<br />                                        All_Frame_data[1]=Frame_Data_number1;                                    <br />                                        Uart_ReceFrame_State=Uart_Dete_Frame_LengthByte1_End;//标明串口已经接收到帧长度的第一个字符<br /><br />                                    }<br />                                    break;<br />                    case Uart_Dete_Frame_LengthByte1_End:<br />                                    {<br />                                        Frame_Data_number2=temp1;<br />                                        All_Frame_data[2]=Frame_Data_number2;<br />                                        Frame_DataLengthNumber_ChangeFromat2();<br />                                        if(Frame_Data_number2>99)/*通讯协议的帧长度字符超出了所定义的最大长度*/<br />                                                            <br />                                                {<br />                                                /*****************************************<br />                                                这里发送数据帧长度出错的信息个PDA<br />                                                *****************************************/<br />                                                ClearMessagePool(MCU_SerialInData_FIFO);                /*清空串口输入消息队列*/<br />                                                All_Frame_data[0]=0;<br />                                                All_Frame_data[1]=0;<br />                                                All_Frame_data[2]=0;<br />                                                //OSQPost(CommandData, Frame_Length_Wrong);/*发送串口出错消息到主程序处理*/<br />                                                Uart_ReceFrame_State=Uart_Dete_Frame_InitState;        <br />                                                }<br />                                        else    /*通讯协议的帧长度字符没有超出了所定义的最大长度*/            <br />                                                {<br />                                                <br />                                                PDA_Command[0]=Frame_Data_number2;    //将串口帧数据长度放入PDA_Command[0]    <br />                                                <br />                                                }<br />                                        Uart_ReceFrame_State=Uart_Dete_Frame_LengthByte2_End;//标明串口已经接收到帧长度的第二个字符<br />                                    }<br />                                    break;<br />                    case Uart_Dete_Frame_LengthByte2_End:<br />                                    {<br />                                          if((temp1>0)&&(temp1<5))<br />                                            {<br />                                                PDA_Command[1]=temp1;            /*将传输数据帧中的指令类型字节放入数组的第二个字节,标明数据是发往哪个子串口的*/<br />                                                  All_Frame_data[3]=temp1;                /*整理帧数据第四个字节,便于计算CRC*/<br />                                                Uart_ReceFrame_State=Uart_Dete_Frame_OrdeTyte_End;//标明串口已经接收到帧长度的命令类型字符<br />                                                Frame_Data_Number_Flag++;<br />                                            }<br />                                           else<br />                                               {<br />                                                ClearMessagePool(MCU_SerialInData_FIFO);                /*清空串口输入消息队列*/<br />                                                All_Frame_data[0]=0;<br />                                                All_Frame_data[1]=0;<br />                                                All_Frame_data[2]=0;<br />                                                //OSQPost(CommandData, Frame_Length_Wrong);/*发送串口出错消息到主程序处理*/<br />                                                Frame_Data_Number_Flag=0;<br />                                                Uart_ReceFrame_State=Uart_Dete_Frame_InitState;        <br />                                            }<br />                                    }<br />                                    break;<br />                    case Uart_Dete_Frame_OrdeTyte_End:<br />                                    {<br />                                                                                        <br />                                                 if((Uart_ReceFrame_State==Uart_Dete_Frame_OrdeTyte_End)&&(Frame_Data_Number_Flag<Frame_Data_number2))        <br />                                                {    <br />                                                All_Frame_data[3+Frame_Data_Number_Flag]= temp1;    //存入All_Frame_data[]准备计算CRC<br />                                                Frame_Data_Number_Flag++;                        //接收到数据变量加1<br />                                                }<br />                                                if(Frame_Data_Number_Flag==Frame_Data_number2)<br />                                                {<br />                                                Uart_ReceFrame_State=Uart_Dete_Frame_DataByte_End;    <br />                                                }<br /> <br />                                    }<br />                                    break;<br />                    case Uart_Dete_Frame_DataByte_End:<br />                                    {<br />                                                if(CRC_16_Number==0)<br />                                                    {<br />                                                    CRC_16_Result_Receiver=temp1;<br />                                                    All_Frame_data[Frame_Data_Number_Flag+3]=temp1;<br />                                                    CRC_16_Result_Receiver=CRC_16_Result_Receiver<<8;<br />                                                    CRC_16_Number=1;<br />                             | 
 |