void UartObj::Decode(void)<br />{<br />unsigned char ch;<br />unsigned int *Ptr;<br /> while (ReceiveWritePtr != ReceiveReadPtr) <br /> {<br /> ch = ReceiveBuffer[ReceiveReadPtr++];<br /> ReceiveReadPtr &= 0xff;<br /> switch (State)<br /> {<br /> case 0://'$'搜索<br /> if (ch == '$')<br /> {<br /> State = 1;<br /> ReceiveCount = 0;<br /> }<br /> ReceivePosition = ReceiveReadPtr;<br /> break;<br /> case 1://命令<br /> if (ch == ':')<br /> {<br /> if (ReceiveCount == 5 && <br /> ReceiveBuffer[ReceivePosition] == 'W' &&<br /> ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'r' &&<br /> ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'i' &&<br /> ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 't' &&<br /> ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 'e')<br /> {<br /> State = 2;//Write命令地址<br /> } <br /> else if (ReceiveCount == 4 && <br /> ReceiveBuffer[ReceivePosition] == 'R' &&<br /> ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'e' &&<br /> ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'a' &&<br /> ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 'd')<br /> {<br /> State = 3;//Read命令地址<br /> } <br /> else if (ReceiveCount == 5 && <br /> ReceiveBuffer[ReceivePosition] == 'E' &&<br /> ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'r' &&<br /> ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'a' &&<br /> ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 's' &&<br /> ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 'e')<br /> {<br /> State = 4;//Erase命令地址<br /> }<br /> else<br /> {<br /> State = 0;<br /> }<br /> ReceiveCount = 0;<br /> ReceivePosition = ReceiveReadPtr;<br /> Address = 0;<br /> Data = 0;<br /> }<br /> else if (ch == ';')<br /> {<br /> if (ReceiveCount == 5 && <br /> ReceiveBuffer[ReceivePosition] == 'R' &&<br /> ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'e' &&<br /> ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 's' &&<br /> ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 'e' &&<br /> ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 't')<br /> {<br /> State = 0;<br /> for(;;);<br /> }<br /> }<br /> else//命令字符个数<br /> {<br /> ReceiveCount ++;<br /> }<br /> break;<br /> case 2://Write命令地址<br /> case 3://Read命令地址<br /> case 4://Erase命令地址<br /> if ((State == 2) && (ch == ','))<br /> {<br /> State = 5;//Write命令数据<br /> }<br /> else if ((State == 3) && (ch == ';'))<br /> {<br /> Ptr = (unsigned int*)Address;<br /> Data = *Ptr;<br /> if ((Address >= 0x80000) && (Address <= 0x8ffff))<br /> {<br /> putstr("FLASH数据读出:[");<br /> }<br /> else<br /> {<br /> putstr("RAM数据读出:][");<br /> }<br /> puthex(Address);<br /> putstr("]=");<br /> puthex(Data);<br /> puts("");<br /> State = 0;<br /> }<br /> else if ((State == 4) && (ch == ';'))<br /> {<br /> if ((Address >= 0x80000) && (Address <= 0x8ffff))<br /> {<br /> Flash.SectorErase((Address & 0xffff) >> 11);<br /> putstr("FLASE扇区擦除:[");<br /> puthex(Address & 0xfffff800);<br /> putstr("-");<br /> puthex(Address | 0x7ff);<br /> putstr("]");<br /> puts("");<br /> }<br /> State = 0;<br /> }<br /> else if ((ch >= '0') && (ch <= '9'))<br /> {<br /> Address <<= 4;<br /> Address |= ch - '0';<br /> }<br /> else if ((ch >= 'A') && (ch <= 'F'))<br /> {<br /> Address <<= 4;<br /> Address |= ch - 'A' + 10;<br /> }<br /> else if ((ch >= 'a') && (ch <= 'f'))<br /> {<br /> Address <<= 4;<br /> Address |= ch - 'a' + 10;<br /> }<br /> break;<br /> case 5://Write命令数据<br /> if (ch == ';')//命令结束字符<br /> {<br /> if ((Address >= 0x80000) && (Address <= 0x8ffff))<br /> {<br /> Flash.Write(FLASH[Address & 0xffff], Data);<br /> putstr("FLASH数据写入:[");<br /> }<br /> else<br /> {<br /> Ptr = (unsigned int*)Address;<br /> *Ptr = Data;<br /> putstr("RAM数据写入:][");<br /> }<br /> puthex(Address);<br /> putstr("]=");<br /> puthex(Data);<br /> puts("");<br /> State = 0;<br /> }<br /> else if ((ch >= '0') && (ch <= '9'))<br /> {<br /> Data <<= 4;<br /> Data |= ch - '0'; <br /> }<br /> else if ((ch >= 'A') && (ch <= 'F'))<br /> {<br /> Data <<= 4;<br /> Data |= ch - 'A' + 10; <br /> }<br /> else if ((ch >= 'a') && (ch <= 'f'))<br /> {<br /> Data <<= 4;<br /> Data |= ch - 'a' + 10; <br /> }<br /> break;<br /> default:<br /> State = 0;<br /> break;<br /> }<br /> }<br />}<br /> |
|