51单片机串口通讯,接收多字节

2020-01-18 18:50发布

本帖最后由 lanfengxun 于 2012-9-17 11:33 编辑

/*************************串口初始化*******************************************/

void Inituart()
{      
        IE=0x90;                            //打开中断总开关及串口中断开关
        SCON = 0x50;                        //设定串行口工作方式1 允许接受
        TMOD = 0x20;                  //定时器1,自动重载, 产生波特率
//    PCON=0x80;                  // 加上他后波特率是19200  SMOD为1
        TL1 = 0xfa;   
        TH1 = 0xfa;                 //波特率为9600 ,221184MHz
        TR1 = 1;         
}

/**************************接收上位机传送数据***************************************/

void uart_js() interrupt 4    //RI==1时执行串口中断
{        
    uchar  static i ;
        if(RI==1)
        {
                RI=0;
                RX_BUF=  SBUF; //保存数据
                i++;
               
        }
        if(i==10)
        {
            i=0;
            RXend = 1;
                LED0=0;  //LED长亮
        }
    }
void main()
{
    uchar  j;
    Inituart();

    while(1)
   {
       while(RXend==0);  //waiting receive end
       RXend=0;
      for(j=0;j<10;j++)
     {
         TxBuf[j] =  RX_BUF[j];  //将需发送数据存入无线发送缓冲区
   }
  }
}

利用串口助手,从上位机向单片机一次发送十个字节,单片机无法接收到,因为灯没亮。请问哪位知道什么原因,实在调试不出来了,跪求!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
lyg407
2020-01-19 00:45

void uart_rx_isr(void) //接收中断函数
{
        uchar c;       
        c=SBUF;//c等于接收的字节;
        switch (recv_state)
        {
                case 0:
                if (c==0x02) // 是数组第一字节
                {
                        recv_state=1; // 进入下一个状态
                }
                else
                        recv_state=0; // 回到初始状态
                break;
               
                case 1:
                if (c!=0xff)  // 是数组第二字节          拢共 3位数据  中间这位 为数据位 就不进行校验判断了
                {
                        recv_state=2; // 进入下一个状态
                        Rx_Data=SBUF;  //把 这个数据 纪录下来 作为 后面的判断
                }
                else
                {
                        recv_state=0; // 回到初始状态
                }
                break;
               
                case 2:
                if (c==0x03)   // 是数组第三字节
                {
                        // recv_state=3; // 进入下一个状态
                          Flag=1;
                        recv_state=0; // 回到初始状态
                 }
                else
                {
                        recv_state=0; // 回到初始状态
                }
                break;
        }
}

void UART_interrupt() interrupt 4
{
        if(RI==1)//如果接收了数据(RI会置1)
        {
                RI=0; //先清零,下次可以在接收数据
                uart_rx_isr();         //调用数据判断这个函数
        }       
}

一周热门 更多>