搜索
bottom↓
回复: 3

请教多机通信问题

[复制链接]

出0入0汤圆

发表于 2012-4-11 10:21:24 | 显示全部楼层 |阅读模式
本帖最后由 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] = '\r';
        TX_data[8] = '\n';

        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] = '\r';
        TX_data0[9] = '\n';
    }
}

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] = '\r';
            TX_data[13] = '\n';

            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] = '\r';
            TX_data0[13] = '\n';

            TX_will_send_full0_flag = 1;

            return;
        }
    }
}

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

        if( ('\r' == 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('\r' == 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;
            }
        }
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-4-11 14:50:18 | 显示全部楼层
顶上来让高手看见

出0入0汤圆

 楼主| 发表于 2012-4-11 16:57:00 | 显示全部楼层
顶起来等高手来

出0入0汤圆

 楼主| 发表于 2012-4-12 08:44:14 | 显示全部楼层
没人帮忙看下吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 21:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表