本帖最后由 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;
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>