当前位置: 代码迷 >> 单片机 >> c51串口
  详细解决方案

c51串口

热度:1123   发布时间:2016-04-28 16:36:18.0
c51串口求助!
串口接收程序如下
void rec_gps(void) interrupt 4 {
  uchar str;
  uint i,k;
  k=0;
  i=0;
if(RI != 1)
return;
do
{
  if (RI)
  {
  RI=0;
  str=SBUF;
  recv_data[i++]=str;
  if (str=='A') //数据接收到A  
  {
if (i>=16) 我命令数出来应该是i=18;但实际是只有1=16的时候这个IF才是真的
  {
  i=0;
  if ((recv_data[3]=='R')&&(recv_data[4]=='M') &&(recv_data[5]=='C')) {
  recv_sucess_flag = 1;
  // flag1 = 1 ;
  return;
  }
}
  }//if str=='A'
  else
  recv_sucess_flag = 0;
  }//if RI
  else
  k++; //防止串口死机
  }
  while((i < 18) && (k < 65535));
   
}

接收数据处理程序
void data_recv_to_ds12c887(void)
{
  int shigps,fengps,miaogps;  
  uchar i,j ;
  IE = 0 ;
  i=recv_data[7] & 0x0f;
  j=recv_data[8] & 0x0f;
  shigps = (i<<4) | j;
  i=recv_data[9] & 0x0f;
  j=recv_data[10] & 0x0f;
  fengps = (i<<4) | j;
  i=recv_data[11] & 0x0f;
  j=recv_data[12] & 0x0f;
  miaogps = (i<<4) | j;
  if(shigps<0x16)
  {
  shigps = shigps + 0x08;
  }
  else
  {
  shigps = shigps - 0x16;
  }
  // if((shigps==shi)&&(fengps==fen)&&(miaogps>(miao--))&&(miaogps<(miao++)))
  // {
  write_ds(0,miaogps); //将GPS调整时间写入DS
  write_ds(2,fengps);
  write_ds(4,shigps);
  RXDGPS = 1 ;
  TXDGPS = 1 ;
  // flag1 = 0 ;
  // }
  // else
 // {
  //置gps授时误差标志位
 // }
  IE = 0x90 ;
}



使用串口小助手通过232发送命令如下:
$GPRMC,021529.000,A

单片机是NXP的89V51

求解我收到数据处理后的shigps , fengps ,miaogps 和我发送的命令中的021529 数据不一致 ,且本人笨没想不通,求大牛们帮我看看!!
PS:有人和我说串口发送逗号,51单片机是不识别的??不会吧?




------解决方案--------------------
你中断里面处理时间很长,上一次发送的字符还没接受完毕,下一次接种中断又来了
------解决方案--------------------
串口中断处理太长了,要短最好就1到2句话,主要修改标志位。
------解决方案--------------------
数据处理放在主函数 中断只置位标志位
  相关解决方案