打印

stc15W串口问题

[复制链接]
718|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taijing33|  楼主 | 2020-12-14 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机一次接受7个数据,然后马上发送出去7个数据。
串口中断中做了侦头校验,数据超过7个就不接受了,
78 87 是单片机接受数据的侦头固定值,
55 AA 是单片机回复数据的侦头固定值,
现在的问题是我一次发给单片机7个
1,正常数据:       78 87 3 4 4   BD 5F。单片机回复55 AA 03 00 87 B6 B9 没有问题
2,数据前加上干扰数据12 33
         发送:12 33 78 87 3 4 4   BD 5F。 单片机回复55 AA 03 00 88 B2 F9 没有问题
3,数据后加上几个干扰数据12 33
发送:                 78 87 3 4 4   BD 5F 12 33。单片机回复BB 1B 02 64 66 E1 FF出现问题。

此时单片机回复的数据无规律,但是每次都相同。
甚至我把单片机回复的数据写成固定值,都不能正常的发送回来。

相关程序如下:
#define R_LEN   7
#define T_LEN   7

unsigned char Usart1_rbuff[R_LEN];
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
        ES    = 1;
        MAX485_EN = 0;
}


//receive  data frames 0x78 0x87 id TH TL CRCH CRCL
//transmit data frames 0x55 0xaa id TH TL CRCH CRCL
void UART1_Int(void) interrupt 4
{
    if (RI == 1)
    {
      RI = 0;
      rdata = SBUF;  
      if(Usart1_r_finish==0)
        {
                    if(rdata !=0x78 || RxCounter1 != 0)        //
                {
                   if(startdata!= 1) //??????????
                   {
                       RxCounter1 = 0;
                       return;
                   }       
                    if(RxCounter1 == 1 && rdata !=0x87) //如果侦头2不是0x87返回
                   {
                       RxCounter1 = 0;
                       return;
                   }                                                                         

                    if(RxCounter1 < R_LEN)
                   {
                        Usart1_rbuff[RxCounter1] =rdata;
                       RxCounter1++;
                    }

               }
               else      
               {
                   //侦头是0x78开始接受
                   Usart1_rbuff[0] = rdata;
                   RxCounter1 = 1;
                   startdata  = 1;
               }
            }      
    }   
}
void usart1_send_onebyte(unsigned char dat)
{

  //  ES=0;   //??????????   
    SBUF = dat;
    while(!TI);  
    TI=0;  
  //  ES=1;   //?????????   
}

void usart1_send_string(unsigned char *str,unsigned int num)
{   
   MAX485_EN = 1;
        while(num--)
        {
                usart1_send_onebyte(*str);
                str++;
        }
       
    MAX485_EN = 0;

}
void com_pro(void)  //这是处理接受到的数据后发送出一组数据
{
    unsigned int crc;
        unsigned char i=2;
        unsigned char Usart1_tbuff[T_LEN]={0x55,0xaa};
   if(Usart1_rbuff[0] == 0x78 && Usart1_rbuff[1] == 0x87 )        //判断侦头1,2
   {
     crc = crc_cal(Usart1_rbuff, R_LEN-2);
         if( Usart1_rbuff[5] == (crc >> 8) && Usart1_rbuff[6] == (crc & 0x00ff) && sensor_id == Usart1_rbuff[2])
         {               //CRC判断
                        //Usart1_tbuff[i++] = 0x55;
                        //Usart1_tbuff[i++] = 0xaa;
                 
                        Usart1_tbuff[i++] = sensor_id;
                         if(sensor_err)
                         {
                                        Usart1_tbuff[i++] = 0xff;
                                        Usart1_tbuff[i++] = 0xff;
                         }
                         else
                         {
                                        Usart1_tbuff[i++] = Cur_temp >>8;
                                        Usart1_tbuff[i++] = Cur_temp;
                         }
                       
                        crc = crc_cal(Usart1_tbuff, T_LEN-2);
                        Usart1_tbuff[i++] = (crc >> 8);
                        Usart1_tbuff[i++] = crc;
                        usart1_send_string(Usart1_tbuff,T_LEN);  //T_LEN==7,回复7个数据,但是不正常时有时候只能回复6个。有时候回复7个
                //        usart1_send_string("12314",T_LEN);  //此处测试发送固定值,都不能正常发送。但是接受到的干扰数组通过了CRC和侦头判断。要不然也执行不到这一步

               //
                 
         }
          
   }
   for(i=0;i<R_LEN;i++)
   {
      Usart1_rbuff[i] = 0;
               
   }
}


void main(void)
{
unsigned int time=0;
  unsigned int time1=0;
  unsigned char z_flag=0;
  unsigned char f_flag=0;

        ini_io();
        Timer0Init();
       UartInit();
       WDT_CONTR = 0X36;
         id_pro();
        while(1)
        {
          WDT_CONTR = 0X36;
          id_pro();
                  if(RxCounter1 >= R_LEN)//??????
                   {
                       Usart1_r_finish = 1;
                       startdata  = 0;
                         RxCounter1 = 0;
                                                                                  
                   }
          if(Usart1_r_finish)            //一帧数据接受完毕标志
           {
                               
                        com_pro();        //处理数据
                        Usart1_r_finish = 0;
                 
           }
           if(a >= 1500)  //1.5s
           {
                         a = 0;
                        ds18B20();
           }
          
  }
}


使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2020-12-14 15:51 | 只看该作者
本帖最后由 LcwSwust 于 2020-12-14 15:53 编辑

你看你用的是485对吧,发送第三帧数据时,由于后方多出两个字节,在发这两个字节的同时,接收方也正在发送,两边同时发你说会不会冲突?谁能收到数据?
建议接收方要等待总线空闲一段时间后才能发送。或者发送帧前面多加几个0

使用特权

评论回复
板凳
taijing33|  楼主 | 2020-12-14 16:55 | 只看该作者
LcwSwust 发表于 2020-12-14 15:51
你看你用的是485对吧,发送第三帧数据时,由于后方多出两个字节,在发这两个字节的同时,接收方也正在发送 ...

太感谢 这位仁兄了。说的问题一点不差。真是佩服!!!惭愧的是 是我做技术多年了,一摊糊涂。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

163

主题

365

帖子

3

粉丝