原来在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 />   |
|