请教多机通信问题

2020-02-04 09:14发布

本帖最后由 szzyq 于 2012-4-11 11:11 编辑

我做了个小车控制器,用2块单片机实现,它们之间通过串口通信,A机一切正常,但B机通信出现问题,部分源程序如下,send_real_speed()和send_communication()单独调试对方都能收到数据。调试时发现只能收到send_real_speed()发来的信息,收不到send_communication()发来的信息,屏蔽掉send_real_speed()这个函数就能收到send_communication()发来的信息,开始以为是变量太多导致堆栈溢出所致,我只保留通信部分程序来调试也是这样,百思不解,请高手帮我看看问题出在哪里,用什么调试方法容易查找问题,谢谢!
void main()
{
  Init_Port();
  init_time0();
  init_UART();
  init_exint0();
  EA=1;
  while(1)
  {
    run_time = 0;
    WDT_CONTR = 0x33;
    send_data();
    send_real_speed();        
    RX_data_operation();
    communication_tx_time++;
    if(700 < communication_tx_time)  //700毫秒执行一次
    {
       communication_tx_time = 0;
       send_communication();
           //LED=!LED;
    }
    while(1 > run_time);  //1毫秒程序循环一次
  }
}

void send_data(void)   //发送数据
{
    if( (0 == TX_will_send_full_flag) && (0 == TX_will_send_full0_flag) ) return;
   
    if(0 == TX_now_flag)
    {
        if(1 == TX_will_send_full_flag)
        {
            TX_data_now[0] = TX_data[0];
            TX_data_now[1] = TX_data[1];
            TX_data_now[2] = TX_data[2];
            TX_data_now[3] = TX_data[3];
            TX_data_now[4] = TX_data[4];
            TX_data_now[5] = TX_data[5];
            TX_data_now[6] = TX_data[6];
            TX_data_now[7] = TX_data[7];
            TX_data_now[8] = TX_data[8];
            TX_data_now[9] = TX_data[9];
            TX_data_now[10] = TX_data[10];
            TX_data_now[11] = TX_data[11];
            TX_data_now[12] = TX_data[12];
            TX_data_now[13] = TX_data[13];
            TX_data_now[14] = TX_data[14];

            TX_byte_count_now = 0;
            TX_now_flag = 1;
            SBUF = ':';

            TX_will_send_full_flag = 0;
        }
        else
        {
            TX_data_now[0] = TX_data0[0];
            TX_data_now[1] = TX_data0[1];
            TX_data_now[2] = TX_data0[2];
            TX_data_now[3] = TX_data0[3];
            TX_data_now[4] = TX_data0[4];
            TX_data_now[5] = TX_data0[5];
            TX_data_now[6] = TX_data0[6];
            TX_data_now[7] = TX_data0[7];
            TX_data_now[8] = TX_data0[8];
            TX_data_now[9] = TX_data0[9];
            TX_data_now[10] = TX_data0[10];
            TX_data_now[11] = TX_data0[11];
            TX_data_now[12] = TX_data0[12];
            TX_data_now[13] = TX_data0[13];
            TX_data_now[14] = TX_data0[14];

            TX_byte_count_now = 0;
            TX_now_flag = 1;
            SBUF = ':';
            
            TX_will_send_full0_flag = 0;
        }
    }
}

void send_communication(void)   //定时通信测试
{
    if(0 == TX_will_send_full_flag)
    {
        TX_will_send_full_flag = 1;
        
        TX_data[0] = 'c';
        TX_data[1] = 'o';
        TX_data[2] = 'm';
        TX_data[3] = ' ';
        
        TX_data[4] = 'c';
        TX_data[5] = '-';
        TX_data[6] = 'd';
        
        TX_data[7] = ' ';
        TX_data[8] = ' ';

        return;
    }

    if(0 == TX_will_send_full0_flag)
    {
        TX_will_send_full0_flag = 1;
        
        TX_data0[0] = 'c';
        TX_data0[1] = 'o';
        TX_data0[2] = 'm';
        TX_data0[3] = ' ';
        
        TX_data0[5] = 'c';
        TX_data0[6] = '-';
        TX_data0[7] = 'd';
        
        TX_data0[8] = ' ';
        TX_data0[9] = ' ';
    }
}

void send_real_speed(void)    //发送实时速度
{
    //if((Left_Speed_Band!=Right_Speed_Band)||Swerve_Resume_Flag) return;
    if(Time0_Count>200)  //在行驶的中途,如果速度传感器故障,速度显示为设定速度值
    {
      Real_Speed=200/Set_Turn_Period;
          Real_Speed0=(2000/Set_Turn_Period)%10;
          Real_Speed00=((20000+Set_Turn_Period/2)/Set_Turn_Period)%10;
          Turn_Count=Turn_Timer/Set_Turn_Period;
          //LED=0;
    }   
    if(RUN == run_state)
    {
        if(0 == TX_will_send_full_flag)
        {
            TX_data[0] = 'r';
            TX_data[1] = 's';
            TX_data[2] = 'p';
            TX_data[3] = ' ';

            //行驶距离
            TX_data[4] = '0';
            TX_data[5] = ((Turn_Count*18)/10) | 0x30;
            TX_data[6] = ((Turn_Count*18)%10) | 0x30;
               
            TX_data[7] = '@';

            //行驶速度
            //TX_data[8]  = Real_Speed | 0x30;
            TX_data[8]  = 3 | 0x30;
            TX_data[9]  = '.';
            TX_data[10] = 3| 0x30;
            TX_data[11] = 3 | 0x30;         
            //TX_data[10] = Real_Speed0| 0x30;
            //TX_data[11] = Real_Speed00 | 0x30;      
            TX_data[12] = ' ';
            TX_data[13] = ' ';

            TX_will_send_full_flag = 1;

            return;
        }

        if(0 == TX_will_send_full0_flag)
        {
            TX_data0[0] = 'r';
            TX_data0[1] = 's';
            TX_data0[2] = 'p';
            TX_data0[3] = ' ';

            //行驶距离
            TX_data0[4] = '0';
            TX_data0[5] = ((Turn_Count*18)/10) | 0x30;
            TX_data[6] = ((Turn_Count*18)%10) | 0x30;
               
            TX_data0[7] = '@';

            //行驶速度
            TX_data[8]  = Real_Speed | 0x30;
            TX_data[9]  = '.';
            TX_data[10] = Real_Speed0| 0x30;
            TX_data[11] = Real_Speed00 | 0x30;              
            TX_data0[12] = ' ';
            TX_data0[13] = ' ';

            TX_will_send_full0_flag = 1;

            return;
        }
    }
}

void int_UART(void) interrupt 4   //中断收发
{
    uchar buf;
   
    if(TI)
    {
        TI = 0;
                //LED=!LED;

        if( (' ' == TX_data_now[TX_byte_count_now-2]) || (15 < TX_byte_count_now) )
        {
            TX_now_flag = 0;

            TX_byte_count_now = 0;
        }
        else
        {
            SBUF = TX_data_now[TX_byte_count_now];
            
            TX_byte_count_now++;
        }
    }
    else
    {
        RI = 0;
        buf = SBUF;
        
        if(1 == RX_now_flag)
        {
            RX_spece_time = 0;
            
            if(' ' == buf)
            {
                RX_data_now[RX_byte_count_now] = buf;
               
                if(0 == RX_ok_flag)
                {
                    RX_data[0] = RX_data_now[0];
                    RX_data[1] = RX_data_now[1];
                    RX_data[2] = RX_data_now[2];
                    RX_data[3] = RX_data_now[3];
                    RX_data[4] = RX_data_now[4];
                    RX_data[5] = RX_data_now[5];
                    RX_data[6] = RX_data_now[6];
                    RX_data[7] = RX_data_now[7];
                    RX_data[8] = RX_data_now[8];
                    RX_data[9] = RX_data_now[9];
                    RX_data[10] = RX_data_now[10];
                    RX_data[11] = RX_data_now[11];
                    RX_data[12] = RX_data_now[12];
                    RX_data[13] = RX_data_now[13];
                    RX_data[14] = RX_data_now[14];

                    RX_ok_flag = 1;
                }

                RX_now_flag = 0;
            }
            else
            {
                RX_data_now[RX_byte_count_now] = buf;

                RX_byte_count_now++;
            }
        }
        else
        {
            if(':' == buf)
            {
                RX_now_flag = 1;

                RX_byte_count_now = 0;
            }
        }
    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。