highplay86 发表于 2012-11-10 13:36:11

无线APC220的串口接收代码出错,求助...

本帖最后由 highplay86 于 2012-11-27 20:27 编辑

最近在搞一个有十多个控制通道的履带车...最开始写了几个通道,代码不多,履带车正常执行...可是到后面随着通道越写越多...发现程序下载进Arduino板子后会出现许多程序紊乱执行的问题...经过不断地烧写实验,觉得是因为履带车接收端的串口接收代码出了问题...

手柄程序应该没问题...应该是是履带车Loop里前几行的串口接收函数出了问题,
现在这套程序执行的效果是:履带车前后左右的运动控制需要摇杆1 和摇杆2 一起拨动,履带车才会运动(而原意是只通过摇杆1 控制履带车的运动...),,而且若希望舵机和步进电机运动,竟然需要摇杆1 和摇杆2 都不是处于中位,再按动对应的按键,舵机和步进电机才能正常的执行运动指令(原意也是仅仅通过按键就可以单独控制舵机和步进电机)...

我对串口接收部分的代码段小幅修改了好多次...(比如说加一句while(!Serial.available());       或者减一句while(!Serial.available());   或者把                  while(!Serial.available());
                  command_temp02=Serial.read();这两句移到

if('B'==Serial.read())
             {
                  while(!Serial.available());
                  command_temp01=Serial.read();
                  while(!Serial.available());
                  command_temp02=Serial.read();
             }
”这段的花括号外面,各种执行的效果都不一样,不同的紊乱效果...
Arduino的串口Serial函数原型看了几次,也看不出什么缘由...

高手求解啊>>>>>>>>>>>感激不尽...


具体代码如下:





/*******************************************************************
履带车控制程序
*******************************************************************/

#include <Movecar.h>
#include <Motorarm.h>
#include <Stepper.h>
#include <Servo.h>

#define STEPS 100// 这里设置步进电机旋转一圈是多少步

Movecar Movecar(20,21);
Motorarm Arm(2,15,16,3,17,18);
Stepper stepper1(STEPS,29,30,31,32);
Servo servo1,servo2,servo3;

int speedtemp01;
int speedtemp02;
int comtemp01,comtemp02;

byte command_temp01,command_temp02;
byte button_up,button_left,button_down,button_right;
byte button_Y,button_X,button_A,button_B;
byte button_black,button_white,button_back,button_start;
int ax,bx,cx;

int Fire01,Fire02;

/******************************************************************
初始化:setup函数
******************************************************************/
void setup()
{
Serial.begin(9600);

pinMode(13,OUTPUT);
servo1.attach(24);servo2.attach(25);servo3.attach(26);
ax=0;bx=0;cx=0;
servo1.write(ax);servo2.write(bx);servo3.write(cx);
}
/****************************************************************************************
执行部分:loop函数
****************************************************************************************/
void loop()
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************************************命令接收及处理程序段*********************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
command_temp01=0x80;command_temp02=0x80;

if(Serial.available())
{
             if('C'==Serial.read())
             {
                  while(!Serial.available());
                  comtemp01=Serial.read();
                  while(!Serial.available());
                  speedtemp01=Serial.read();
             }
             while(!Serial.available());
             if('D'==Serial.read())
             {
                  while(!Serial.available());
                  comtemp02=Serial.read();
                  while(!Serial.available());
                  speedtemp02=Serial.read();
             }
             while(!Serial.available());
             if('B'==Serial.read())
             {
                  while(!Serial.available());
                  command_temp01=Serial.read();
                  while(!Serial.available());
                  command_temp02=Serial.read();
             }

}

/*********************************************************************************************************************************************************************************************/
/************************************************************************************履带车端各种执行器程序段*********************************************************************************/
/*********************************************************************************************************************************************************************************************/

switch(comtemp01)
                  {
                      case 'w': Movecar.forward(speedtemp01);break;
                      case 's': Movecar.back(speedtemp01);break;
                      case 'a': Movecar.turnleftorgin(speedtemp01);break;
                      case 'd': Movecar.turnrightorgin(speedtemp01);break;
                      case 'q': Movecar.turnleft(speedtemp01);break;
                      case 'e': Movecar.turnright(speedtemp01);break;
                      case 't': Movecar.stop();break;
                      case 'z': Movecar.backturnleft(speedtemp01);break;
                      case 'c': Movecar.backturnright(speedtemp01);break;
                      default:
                              Movecar.stop();
                              break;
                  }


/**************************************************************************************/
/**************************************************************************************/
stepper1.setSpeed(100);
switch(comtemp02)
                  {
                      case 'w':{break;}
                              
                      case 'a':{stepper1.step(20);break;}
                              
                      case 's':{break;}
                              
                      case 'd':{stepper1.step(-20);break;}
                              
                      case 'q':{break;}
                              
                      case 'e':{break;}

                      case 'z':{break;}
                              
                      case 'c':{break;}
                     
                      case 't':{stepper1.setSpeed(0);break;}
                  }

/**************************************************************************************/
/**************************************************************************************/

button_left=command_temp01&0x02;
if(button_left==0x02)
{
          if(ax<180)
      {
      ax+=5;
      servo1.write(ax);//设置舵机旋转的角度
      }
}

button_right=command_temp01&0x08;
if(button_right==0x08)
{
          if(ax>0)
      {
      ax-=5;
      servo1.write(ax);//设置舵机旋转的角度
      }
}

button_up=command_temp01&0x01;
button_down=command_temp01&0x04;
button_Y=command_temp01&0x10;
button_X=command_temp01&0x20;

if(button_up==0x0&&button_down==0x0&&button_Y==0x0&&button_X==0x0){Arm.stop();digitalWrite(13,LOW);}

      if(button_up==0x01){Arm.moveAz(250);digitalWrite(13,HIGH);delay(200);}
      if(button_down==0x04){Arm.moveAf(250);digitalWrite(13,HIGH);delay(200);}

      if(button_Y==0x10){Arm.moveBz(250);digitalWrite(13,HIGH);delay(200);}
      if(button_X==0x20){Arm.moveBf(250);digitalWrite(13,HIGH);delay(200);}

button_A=command_temp01&0x40;
button_B=command_temp02&0x01;
button_black=command_temp02&0x02;
button_white=command_temp02&0x04;

if(button_A==0x40)
{
          if(ax>0)
      {
      ax-=5;
      servo1.write(ax);//设置舵机旋转的角度
      }
}

if(button_B==0x01)
{
          if(bx<180)
      {
      bx+=5;
      servo2.write(bx);//设置舵机旋转的角度
      }
}

if(button_black==0x02)
{
          if(bx<180)
      {
      bx+=5;
      servo2.write(bx);//设置舵机旋转的角度
      }
}

if(button_white==0x04)
{
          if(bx>0)
      {
      bx-=5;
      servo2.write(bx);//设置舵机旋转的角度
      }
}


command_temp01=0x800;command_temp02=0x80;
/**************************************************************************************************************************************************************************************************************************/
/**************************************************************************************************************************************************************************************************************************/
}





/*****************************************************

项目:手柄程序
作者: ..Nin..

*****************************************************/

/****************************************************************************************    分割线   *************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/**************************************************************************************************************/
                        ///////////////////宏定义////////////////////
/**************************************************************************************************************/

//////////////摇杆1/////////////////
#define joystick1_up_down 0
#define joystick1_left_right 1
#define joystick1_key 6
#define wheel_left 4

//////////////摇杆2/////////////////
#define joystick2_up_down 2
#define joystick2_left_right 3
#define joystick2_key 7
#define wheel_right 5

///////////标准四向键盘/////////////
#define KEY_UP 8
#define KEY_LEFT 9
#define KEY_DOWN 10
#define KEY_RIGHT 11

///////////YXAB四向键盘/////////////
#define KEY_Y 2
#define KEY_X 3
#define KEY_A 5
#define KEY_B 4

///////////BLACK,WHITE,BACK,START键盘/////////////
#define BUTTON_BLACK 7
#define BUTTON_WHITE 6
#define BUTTON_BACK 12
#define BUTTON_START 13

/**************************************************************************************************************/
                           //////////////////摇杆及键盘数据变量//////////////////
/**************************************************************************************************************/
int value_up_down_01;
int value_left_right_01;
int value_up_down_02;
int value_left_right_02;

int val01,val02,val03,val04;
int val05,val06,val07,val08;
int val09,val10,val11,val12;
int val13,val14;

int value_wheel_left;
int value_wheel_right;

/////////////////////指令数据变量//////////////////
int comtemp01,oldcomtemp01;
int comtemp02,oldcomtemp02;

byte command_bin_01=0x80;
byte command_bin_02=0x80;

/*****************************************************************************************************************************************************************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************************************************************************************************************************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************************************************************************************************************************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////







void setup()
{
Serial.begin(9600);
pinMode(KEY_UP,INPUT);//定义按键接口为输入接口
pinMode(KEY_LEFT,INPUT);//定义按键接口为输入接口
pinMode(KEY_DOWN,INPUT);//定义按键接口为输入接口
pinMode(KEY_RIGHT,INPUT);//定义按键接口为输入接口
pinMode(KEY_Y,INPUT);//定义按键接口为输入接口
pinMode(KEY_X,INPUT);//定义按键接口为输入接口
pinMode(KEY_A,INPUT);//定义按键接口为输入接口
pinMode(KEY_B,INPUT);//定义按键接口为输入接口
pinMode(BUTTON_BLACK,INPUT);//定义按键接口为输入接口
pinMode(BUTTON_WHITE,INPUT);//定义按键接口为输入接口
pinMode(BUTTON_BACK,INPUT);//定义按键接口为输入接口
pinMode(BUTTON_START,INPUT);//定义按键接口为输入接口
}

/*****************************************************************************************************************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////主程序///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************************************************************************************************************************************************************************/

void loop()
{
   
   /*********************************************************************************************************************************************************
                                                                  摇杆1
   *********************************************************************************************************************************************************/
   ////////////////////读取摇杆1的模拟值/////////////////////////////////////
   value_up_down_01=analogRead(joystick1_up_down);
   value_left_right_01=analogRead(joystick1_left_right);
   //////////////////////////////////////////////////////////////////////////
   if(value_up_down_01>560)//摇杆1向上
   {
          if(value_left_right_01<460)//摇杆1向右
          {
            comtemp01='e';//右转
          }
          else if(value_left_right_01>560)//摇杆1向左
          {
            comtemp01='q';//左转
          }
          else
          {
            comtemp01='w';//向前
          }
   }
   else if(value_up_down_01<460)//摇杆1向下
   {
          if(value_left_right_01<460)//摇杆1向右
          {
            comtemp01='c';//右退
          }
          else if(value_left_right_01>560)//摇杆1向左
          {
            comtemp01='z';//左退
          }
          else
          {
            comtemp01='s';//后退
          }
   }
   else
   {
          if(value_left_right_01<460)//摇杆1向右
          {
            comtemp01='d';//原地右转
          }
          else if(value_left_right_01>560)//摇杆1向左
          {
            comtemp01='a';//原地左转
          }
          else
          {
            comtemp01='t';//停止子函数
          }
   }
   //当comtemp和oldcomtemp的值都为t时不发送指令
   
   ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
   
   if(!((comtemp01=='t')&&(oldcomtemp01=='t')))
   {
         Serial.print('C');
         Serial.write(comtemp01);
         if(comtemp01=='w')
         {
         Serial.write((value_up_down_01-512)/2);
         //通过公式变换为速度值
         }
         else if(comtemp01=='s')
         {
         Serial.write(255-(value_up_down_01/2));
         //通过公式变换为速度值
         }
         else if((comtemp01=='q')||(comtemp01=='a')||(comtemp01=='z'))
         {
            Serial.write((value_left_right_01-512)/2);
          //通过公式变换为速度值
         }
         else if((comtemp01=='e')||(comtemp01=='d')||(comtemp01=='c'))
         {
            Serial.write(255-(value_left_right_01/2));
         //通过公式变换为速度值
         }
         else
         {
             Serial.write((byte)0);
         }
         oldcomtemp01=comtemp01;
   }
   
   
   /**************************************************************************************************************************************************************
                                                                        摇杆2
   **************************************************************************************************************************************************************/
   ////////////////////读取摇杆2的模拟值/////////////////////////////////////
   value_up_down_02=analogRead(joystick2_up_down);
   value_left_right_02=analogRead(joystick2_left_right);
   //////////////////////////////////////////////////////////////////////////
   if(value_up_down_02<460)//摇杆2向上
   {
          if(value_left_right_02>560)//摇杆2向右
          {
            comtemp02='e';//右上
          }
          else if(value_left_right_02<460)//摇杆2向左
          {
            comtemp02='q';//左上
          }
          else
          {
            comtemp02='w';//向上
          }
   }
   else if(value_up_down_02>560)//摇杆2向下
   {
          if(value_left_right_02>560)//摇杆2向右
          {
            comtemp02='c';//右下
          }
          else if(value_left_right_02<460)//摇杆2向左
          {
            comtemp02='z';//左下
          }
          else
          {
            comtemp02='s';//向下
          }
   }

   else
   {
          if(value_left_right_02>560)//摇杆2向右
          {
                if(value_up_down_02>560)//摇杆2向下
            {
                comtemp02='c';//右下
            }
            else if(value_up_down_02<460)//摇杆2向上
            {
                comtemp02='e';//右上
            }
            else
            {
                comtemp02='d';//右旋
            }
          }
          else if(value_left_right_02<460)//摇杆2向左
          {
                if(value_up_down_02>560)//摇杆2向下
            {
                comtemp02='z';//左下
            }
            else if(value_up_down_02<460)//摇杆2向上
            {
                comtemp02='q';//左上
            }
            else
            {
                comtemp02='a';//左旋
            }
          }
          else
          {
            comtemp02='t';//停止子函数
          }
   }
   //当comtemp和oldcomtemp的值都为t时不发送指令

   ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
   
   if(!((comtemp02=='t')&&(oldcomtemp02=='t')))
   {
         Serial.print('D');
         Serial.write(comtemp02);
         if(comtemp02=='w')
         {
         Serial.write(255-(value_up_down_02/2));
         //通过公式变换为速度值
         }
         else if(comtemp02=='s')
         {
         Serial.write((value_up_down_02-512)/2);
         //通过公式变换为速度值
         }
         else if((comtemp02=='q')||(comtemp02=='a')||(comtemp02=='z'))
         {
            Serial.write(255-(value_left_right_02/2));
          //通过公式变换为速度值
         }
         else if((comtemp02=='e')||(comtemp02=='d')||(comtemp02=='c'))
         {
             Serial.write((value_left_right_02-512)/2);
         //通过公式变换为速度值
         }
         else
         {
             Serial.write((byte)0);
         }
         oldcomtemp02=comtemp02;
   }


   /******************************************************************************************************************************************************************
                                                                            标准四向键盘
   *******************************************************************************************************************************************************************/
   
   command_bin_01=0x80;
   
   val01=digitalRead(KEY_UP);//读取数字KEY_UP 口电平值赋给val01
   if(val01==LOW)//检测按键是否按下
   command_bin_01|=0x01;
   
   val02=digitalRead(KEY_LEFT);//读取数字KEY_LEFT 口电平值赋给val02
   if(val02==LOW)//检测按键是否按下
   command_bin_01|=0x02;
   
   val03=digitalRead(KEY_DOWN);//读取数字KEY_DOWN 口电平值赋给val03
   if(val03==LOW)//检测按键是否按下
   command_bin_01|=0x04;
   
   val04=digitalRead(KEY_RIGHT);//读取数字KEY_RIGHT 口电平值赋给val04
   if(val04==LOW)//检测按键是否按下
   command_bin_01|=0x08;

   /******************************************************************************************************************************************************************
                                                                            YXAB四向键盘
   *******************************************************************************************************************************************************************/
   
   val05=digitalRead(KEY_Y);//读取数字KEY_Y 口电平值赋给val05
   if(val05==LOW)//检测按键是否按下
   command_bin_01|=0x10;
   
   val06=digitalRead(KEY_X);//读取数字KEY_X 口电平值赋给val06
   if(val06==LOW)//检测按键是否按下
   command_bin_01|=0x20;
   
   val07=digitalRead(KEY_A);//读取数字KEY_A 口电平值赋给val07
   if(val07==LOW)//检测按键是否按下
   command_bin_01|=0x40;
   
   Serial.print('B');
   Serial.write(command_bin_01);
   
   /******************************************************************************************************************************************************************
                                                                      BLACK,WHITE,BACK,START键盘
   *******************************************************************************************************************************************************************/
   command_bin_02=0x80;
   
   val08=digitalRead(KEY_B);//读取数字KEY_B 口电平值赋给val08
   if(val08==LOW)//检测按键是否按下
   command_bin_02|=0x01;
   
   val09=digitalRead(BUTTON_BLACK);//读取数字BUTTON_BLACK 口电平值赋给val09
   if(val09==LOW)//检测按键是否按下
   command_bin_02|=0x02;
   
   val10=digitalRead(BUTTON_WHITE);//读取数字BUTTON_WHITE 口电平值赋给val10
   if(val10==LOW)//检测按键是否按下
   command_bin_02|=0x04;
   
   val11=digitalRead(BUTTON_BACK);//读取数字BUTTON_BACK 口电平值赋给val11
   if(val11==LOW)//检测按键是否按下
   command_bin_02|=0x08;
   
   val12=digitalRead(BUTTON_START);//读取数字BUTTON_START 口电平值赋给val12
   if(val12==LOW)//检测按键是否按下
   command_bin_02|=0x10;
   
   
   /******************************************************************************************************************************************************************
                                                               摇杆按键1、2及手柄上方两个模拟按键左、右
   *******************************************************************************************************************************************************************/
   
   
   val13=analogRead(joystick1_key);//读取数字joystick1_key 口电平值赋给val13
   if(val13>=512)//检测按键是否按下
   command_bin_02|=0x20;
   
   val14=analogRead(joystick2_key);//读取数字joystick2_key 口电平值赋给val14
   if(val14>=512)//检测按键是否按下
   command_bin_02|=0x40;

   
   value_wheel_left=analogRead(wheel_left);
   value_wheel_right=analogRead(wheel_right);
   
   value_wheel_left=value_wheel_left/2;
       //通过公式变换为速度值
   value_wheel_right=value_wheel_right/2;
       //通过公式变换为速度值
      
   Serial.write(command_bin_02);
      
   delay(200);

    /************************************************************************************************************************************************************************************************/
    /************************************************************************************************************************************************************************************************/
   
   
    /************************************************************************************************************************************************************************************************/
}









maojidan 发表于 2012-11-10 21:03:17

:funk:霸气!

小黑 发表于 2012-11-12 20:22:35

都是好东西啊呵呵呵呵
页: [1]
查看完整版本: 无线APC220的串口接收代码出错,求助...