在51单片机中,我们使用上下位机时,我们通常会发送一串字符串,将它作为信号发给单片机处理。
 因为串口通信时,发送信息是以一个个字符的形式发送过来的,所以接收的就是一个个字符,通常我们是一个字符数组保存,在进行下一步处理,同时字符数组长度固定有限,但是如果上位机发送的字符不满足我们想要处理的数据时,其接收的数据多出的部分就有可能保存在SBUF中, 影响接下来的数据接收,以至于接下来的数据不满足我们的要求。或是发送数据少于数组长度时,也会出错。
 在这里我的解决办法(以下以STC12C5A60S2芯片为例):
void serial_port_one_init()
 { //根据自己单片机设置;
 //22.1184M ?? 115200???
  SCON = 0x50; //8???,?????
  BRT = 0xFA;
  AUXR |= 0x04;
  AUXR |= 0x01;
  AUXR |= 0x10;
  ES = 1; //
  EA = 1; //
 }
 #define Data_SIZE 10 //数据长度 9位数据 + /r/n - /n =10位
char RevBuf[Data_SIZE]; //
 char temp[Data_SIZE]; //
 unsigned char flished_flag=0; //
 int data_count=0; //
 int temp_length; //
 int data_flished_count = 0; //
 char data_flished; //
void UART_one_Interrupt_Receive(void) interrupt 4
 { 
  uchar temp;
  if(RI==1)
  {
  RI=0;
  temp=SBUF;
 // senduart(temp); //用来测试过数据接收是否正确
 
  if(temp!='\n') //判断是否接收到结束符
 {
  RevBuf[data_count]=temp;// 否,就存到RevBuf【】数组中
 data_count++;
  }
  else
  {
  temp_length=data_count;//是,记录其数据长度
 data_count=0;
  }
  
  }
  
 }
void main(void)
{
 serial_port_one_init(); //串口初始化
 while(1)
 {
 if(Data_SIZE == temp_length) //判断数据长度是否满足我们的要求。
 {
  for(i=0;i<Wifi_Data_SIZE;i++)
  {
  temp[i]=RevBuf[i]; // 同时我们将temp【】作为缓冲区,防止数据被冲到
 }
  flished_flag=1; //数据接收成功标志
 }
 if(1==flished_flag) // 数据接收完整成功
 {
  
  wifi_flished_flag=0; //
 //
 //你想要实现的功能
 }
  }
 while(1);
 }
同时某些特殊情况,我们会将数据写成:数据头+数据 
分析数据头,实现其代表的功能
 上位机中 要在发送数据的最后加上 ‘/n’这个字符
 用串口工具测试时, 发送数据为:数据+enter键(其代表的是两个字符 /r /n)