极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10252|回复: 2

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

[复制链接]
发表于 2012-11-10 13:36:11 | 显示全部楼层 |阅读模式
本帖最后由 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函数原型看了几次,也看不出什么缘由...

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


具体代码如下:





  1. /*******************************************************************
  2. 履带车控制程序
  3. *******************************************************************/

  4. #include <Movecar.h>
  5. #include <Motorarm.h>
  6. #include <Stepper.h>
  7. #include <Servo.h>

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

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

  13. int speedtemp01;
  14. int speedtemp02;
  15. int comtemp01,comtemp02;

  16. byte command_temp01,command_temp02;
  17. byte button_up,button_left,button_down,button_right;
  18. byte button_Y,button_X,button_A,button_B;
  19. byte button_black,button_white,button_back,button_start;
  20. int ax,bx,cx;

  21. int Fire01,Fire02;

  22. /******************************************************************
  23. 初始化:setup函数
  24. ******************************************************************/
  25. void setup()
  26. {
  27.   Serial.begin(9600);
  28.   
  29.   pinMode(13,OUTPUT);
  30.   servo1.attach(24);servo2.attach(25);servo3.attach(26);
  31.   ax=0;bx=0;cx=0;
  32.   servo1.write(ax);servo2.write(bx);servo3.write(cx);
  33. }
  34. /****************************************************************************************
  35. 执行部分:loop函数
  36. ****************************************************************************************/
  37. void loop()
  38. {
  39.   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40.   /*****************************************************************************命令接收及处理程序段*********************************************************************************************/
  41.   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42.   command_temp01=0x80;command_temp02=0x80;
  43.   
  44.   if(Serial.available())
  45.   {
  46.              if('C'==Serial.read())
  47.              {
  48.                   while(!Serial.available());
  49.                   comtemp01=Serial.read();
  50.                   while(!Serial.available());
  51.                   speedtemp01=Serial.read();
  52.              }
  53.              while(!Serial.available());
  54.              if('D'==Serial.read())
  55.              {
  56.                   while(!Serial.available());
  57.                   comtemp02=Serial.read();
  58.                   while(!Serial.available());
  59.                   speedtemp02=Serial.read();
  60.              }
  61.              while(!Serial.available());
  62.              if('B'==Serial.read())
  63.              {
  64.                   while(!Serial.available());
  65.                   command_temp01=Serial.read();
  66.                   while(!Serial.available());
  67.                   command_temp02=Serial.read();
  68.              }

  69.   }

  70.   /*********************************************************************************************************************************************************************************************/
  71.   /************************************************************************************履带车端各种执行器程序段*********************************************************************************/
  72.   /*********************************************************************************************************************************************************************************************/

  73.   switch(comtemp01)
  74.                     {
  75.                       case 'w': Movecar.forward(speedtemp01);break;
  76.                       case 's': Movecar.back(speedtemp01);break;
  77.                       case 'a': Movecar.turnleftorgin(speedtemp01);break;
  78.                       case 'd': Movecar.turnrightorgin(speedtemp01);break;
  79.                       case 'q': Movecar.turnleft(speedtemp01);break;
  80.                       case 'e': Movecar.turnright(speedtemp01);break;
  81.                       case 't': Movecar.stop();break;
  82.                       case 'z': Movecar.backturnleft(speedtemp01);break;
  83.                       case 'c': Movecar.backturnright(speedtemp01);break;
  84.                       default:
  85.                                 Movecar.stop();
  86.                               break;
  87.                     }


  88. /**************************************************************************************/
  89. /**************************************************************************************/
  90. stepper1.setSpeed(100);
  91. switch(comtemp02)
  92.                     {
  93.                       case 'w':{break;}
  94.                               
  95.                       case 'a':{stepper1.step(20);break;}
  96.                               
  97.                       case 's':{break;}
  98.                               
  99.                       case 'd':{stepper1.step(-20);break;}
  100.                               
  101.                       case 'q':{break;}
  102.                               
  103.                       case 'e':{break;}

  104.                       case 'z':{break;}
  105.                               
  106.                       case 'c':{break;}
  107.                      
  108.                       case 't':{stepper1.setSpeed(0);break;}
  109.                     }

  110. /**************************************************************************************/
  111. /**************************************************************************************/

  112. button_left=command_temp01&0x02;
  113. if(button_left==0x02)
  114. {
  115.           if(ax<180)
  116.       {
  117.         ax+=5;
  118.         servo1.write(ax);//设置舵机旋转的角度
  119.       }
  120. }

  121. button_right=command_temp01&0x08;
  122. if(button_right==0x08)
  123. {
  124.           if(ax>0)
  125.       {
  126.         ax-=5;
  127.         servo1.write(ax);//设置舵机旋转的角度
  128.       }
  129. }

  130. button_up=command_temp01&0x01;
  131. button_down=command_temp01&0x04;
  132. button_Y=command_temp01&0x10;
  133. button_X=command_temp01&0x20;

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

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

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

  139. button_A=command_temp01&0x40;
  140. button_B=command_temp02&0x01;
  141. button_black=command_temp02&0x02;
  142. button_white=command_temp02&0x04;

  143. if(button_A==0x40)
  144. {
  145.           if(ax>0)
  146.       {
  147.         ax-=5;
  148.         servo1.write(ax);//设置舵机旋转的角度
  149.       }
  150. }

  151. if(button_B==0x01)
  152. {
  153.           if(bx<180)
  154.       {
  155.         bx+=5;
  156.         servo2.write(bx);//设置舵机旋转的角度
  157.       }
  158. }

  159. if(button_black==0x02)
  160. {
  161.           if(bx<180)
  162.       {
  163.         bx+=5;
  164.         servo2.write(bx);//设置舵机旋转的角度
  165.       }
  166. }

  167. if(button_white==0x04)
  168. {
  169.           if(bx>0)
  170.       {
  171.         bx-=5;
  172.         servo2.write(bx);//设置舵机旋转的角度
  173.       }
  174. }


  175. command_temp01=0x800;command_temp02=0x80;
  176. /**************************************************************************************************************************************************************************************************************************/
  177. /**************************************************************************************************************************************************************************************************************************/
  178. }
复制代码





  1. /*****************************************************

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

  4. *****************************************************/

  5. /****************************************************************************************    分割线     *************************************************************************************************************/
  6. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  7. /**************************************************************************************************************/
  8.                           ///////////////////宏定义////////////////////
  9. /**************************************************************************************************************/

  10. //////////////摇杆1/////////////////
  11. #define joystick1_up_down 0
  12. #define joystick1_left_right 1
  13. #define joystick1_key 6
  14. #define wheel_left 4

  15. //////////////摇杆2/////////////////
  16. #define joystick2_up_down 2
  17. #define joystick2_left_right 3
  18. #define joystick2_key 7
  19. #define wheel_right 5

  20. ///////////标准四向键盘/////////////
  21. #define KEY_UP 8
  22. #define KEY_LEFT 9
  23. #define KEY_DOWN 10
  24. #define KEY_RIGHT 11

  25. ///////////YXAB四向键盘/////////////
  26. #define KEY_Y 2
  27. #define KEY_X 3
  28. #define KEY_A 5
  29. #define KEY_B 4

  30. ///////////BLACK,WHITE,BACK,START键盘/////////////
  31. #define BUTTON_BLACK 7
  32. #define BUTTON_WHITE 6
  33. #define BUTTON_BACK 12
  34. #define BUTTON_START 13

  35. /**************************************************************************************************************/
  36.                              //////////////////摇杆及键盘数据变量//////////////////
  37. /**************************************************************************************************************/
  38. int value_up_down_01;
  39. int value_left_right_01;
  40. int value_up_down_02;
  41. int value_left_right_02;

  42. int val01,val02,val03,val04;
  43. int val05,val06,val07,val08;
  44. int val09,val10,val11,val12;
  45. int val13,val14;

  46. int value_wheel_left;
  47. int value_wheel_right;

  48. /////////////////////指令数据变量//////////////////
  49. int comtemp01,oldcomtemp01;
  50. int comtemp02,oldcomtemp02;

  51. byte command_bin_01=0x80;
  52. byte command_bin_02=0x80;

  53. /*****************************************************************************************************************************************************************************************************************/
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. /*****************************************************************************************************************************************************************************************************************/
  56. /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. /*****************************************************************************************************************************************************************************************************************/
  58. /////////////////////////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////////////////////







  59. void setup()
  60. {
  61.   Serial.begin(9600);
  62.   pinMode(KEY_UP,INPUT);//定义按键接口为输入接口
  63.   pinMode(KEY_LEFT,INPUT);//定义按键接口为输入接口
  64.   pinMode(KEY_DOWN,INPUT);//定义按键接口为输入接口
  65.   pinMode(KEY_RIGHT,INPUT);//定义按键接口为输入接口
  66.   pinMode(KEY_Y,INPUT);//定义按键接口为输入接口
  67.   pinMode(KEY_X,INPUT);//定义按键接口为输入接口
  68.   pinMode(KEY_A,INPUT);//定义按键接口为输入接口
  69.   pinMode(KEY_B,INPUT);//定义按键接口为输入接口
  70.   pinMode(BUTTON_BLACK,INPUT);//定义按键接口为输入接口
  71.   pinMode(BUTTON_WHITE,INPUT);//定义按键接口为输入接口
  72.   pinMode(BUTTON_BACK,INPUT);//定义按键接口为输入接口
  73.   pinMode(BUTTON_START,INPUT);//定义按键接口为输入接口
  74. }

  75. /*****************************************************************************************************************************************************************************************************************/
  76. //////////////////////////////////////////////////////////////////////////////////////////////////////主程序///////////////////////////////////////////////////////////////////////////////////////////////////////
  77. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. /*****************************************************************************************************************************************************************************************************************/

  79. void loop()
  80. {
  81.    
  82.    /*********************************************************************************************************************************************************
  83.                                                                     摇杆1
  84.    *********************************************************************************************************************************************************/
  85.    ////////////////////读取摇杆1的模拟值/////////////////////////////////////
  86.    value_up_down_01=analogRead(joystick1_up_down);
  87.    value_left_right_01=analogRead(joystick1_left_right);
  88.    //////////////////////////////////////////////////////////////////////////
  89.    if(value_up_down_01>560)//摇杆1向上
  90.    {
  91.           if(value_left_right_01<460)//摇杆1向右
  92.           {
  93.             comtemp01='e';//右转
  94.           }
  95.           else if(value_left_right_01>560)//摇杆1向左
  96.           {
  97.             comtemp01='q';//左转
  98.           }
  99.           else
  100.           {
  101.             comtemp01='w';//向前
  102.           }
  103.    }
  104.    else if(value_up_down_01<460)//摇杆1向下
  105.    {
  106.           if(value_left_right_01<460)//摇杆1向右
  107.           {
  108.             comtemp01='c';//右退
  109.           }
  110.           else if(value_left_right_01>560)//摇杆1向左
  111.           {
  112.             comtemp01='z';//左退
  113.           }
  114.           else
  115.           {
  116.             comtemp01='s';//后退
  117.           }
  118.    }
  119.    else
  120.    {
  121.           if(value_left_right_01<460)//摇杆1向右
  122.           {
  123.             comtemp01='d';//原地右转
  124.           }
  125.           else if(value_left_right_01>560)//摇杆1向左
  126.           {
  127.             comtemp01='a';//原地左转
  128.           }
  129.           else
  130.           {
  131.             comtemp01='t';//停止子函数
  132.           }
  133.    }
  134.    //当comtemp和oldcomtemp的值都为t时不发送指令
  135.    
  136.    ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
  137.    
  138.    if(!((comtemp01=='t')&&(oldcomtemp01=='t')))
  139.    {
  140.          Serial.print('C');
  141.          Serial.write(comtemp01);
  142.          if(comtemp01=='w')
  143.          {
  144.            Serial.write((value_up_down_01-512)/2);
  145.            //通过公式变换为速度值
  146.          }
  147.          else if(comtemp01=='s')
  148.          {
  149.            Serial.write(255-(value_up_down_01/2));
  150.            //通过公式变换为速度值
  151.          }
  152.          else if((comtemp01=='q')||(comtemp01=='a')||(comtemp01=='z'))
  153.          {
  154.             Serial.write((value_left_right_01-512)/2);
  155.           //通过公式变换为速度值
  156.          }
  157.          else if((comtemp01=='e')||(comtemp01=='d')||(comtemp01=='c'))
  158.          {
  159.             Serial.write(255-(value_left_right_01/2));
  160.            //通过公式变换为速度值
  161.          }
  162.          else
  163.          {
  164.              Serial.write((byte)0);
  165.          }
  166.          oldcomtemp01=comtemp01;
  167.    }
  168.    
  169.    
  170.    /**************************************************************************************************************************************************************
  171.                                                                         摇杆2
  172.    **************************************************************************************************************************************************************/
  173.    ////////////////////读取摇杆2的模拟值/////////////////////////////////////
  174.    value_up_down_02=analogRead(joystick2_up_down);
  175.    value_left_right_02=analogRead(joystick2_left_right);
  176.    //////////////////////////////////////////////////////////////////////////
  177.    if(value_up_down_02<460)//摇杆2向上
  178.    {
  179.           if(value_left_right_02>560)//摇杆2向右
  180.           {
  181.             comtemp02='e';//右上
  182.           }
  183.           else if(value_left_right_02<460)//摇杆2向左
  184.           {
  185.             comtemp02='q';//左上
  186.           }
  187.           else
  188.           {
  189.             comtemp02='w';//向上
  190.           }
  191.    }
  192.    else if(value_up_down_02>560)//摇杆2向下
  193.    {
  194.           if(value_left_right_02>560)//摇杆2向右
  195.           {
  196.             comtemp02='c';//右下
  197.           }
  198.           else if(value_left_right_02<460)//摇杆2向左
  199.           {
  200.             comtemp02='z';//左下
  201.           }
  202.           else
  203.           {
  204.             comtemp02='s';//向下
  205.           }
  206.    }

  207.    else
  208.    {
  209.           if(value_left_right_02>560)//摇杆2向右
  210.           {
  211.                 if(value_up_down_02>560)//摇杆2向下
  212.               {
  213.                 comtemp02='c';//右下
  214.               }
  215.               else if(value_up_down_02<460)//摇杆2向上
  216.               {
  217.                 comtemp02='e';//右上
  218.               }
  219.               else
  220.               {
  221.                 comtemp02='d';//右旋
  222.               }
  223.           }
  224.           else if(value_left_right_02<460)//摇杆2向左
  225.           {
  226.                 if(value_up_down_02>560)//摇杆2向下
  227.               {
  228.                 comtemp02='z';//左下
  229.               }
  230.               else if(value_up_down_02<460)//摇杆2向上
  231.               {
  232.                 comtemp02='q';//左上
  233.               }
  234.               else
  235.               {
  236.                 comtemp02='a';//左旋
  237.               }
  238.           }
  239.           else
  240.           {
  241.             comtemp02='t';//停止子函数
  242.           }
  243.    }
  244.    //当comtemp和oldcomtemp的值都为t时不发送指令

  245.    ////////////////////////////////////////////////////////////命令数值计算///////////////////////////////////////////////////////
  246.    
  247.    if(!((comtemp02=='t')&&(oldcomtemp02=='t')))
  248.    {
  249.          Serial.print('D');
  250.          Serial.write(comtemp02);
  251.          if(comtemp02=='w')
  252.          {
  253.            Serial.write(255-(value_up_down_02/2));
  254.            //通过公式变换为速度值
  255.          }
  256.          else if(comtemp02=='s')
  257.          {
  258.            Serial.write((value_up_down_02-512)/2);
  259.            //通过公式变换为速度值
  260.          }
  261.          else if((comtemp02=='q')||(comtemp02=='a')||(comtemp02=='z'))
  262.          {
  263.             Serial.write(255-(value_left_right_02/2));
  264.           //通过公式变换为速度值
  265.          }
  266.          else if((comtemp02=='e')||(comtemp02=='d')||(comtemp02=='c'))
  267.          {
  268.              Serial.write((value_left_right_02-512)/2);
  269.            //通过公式变换为速度值
  270.          }
  271.          else
  272.          {
  273.              Serial.write((byte)0);
  274.          }
  275.          oldcomtemp02=comtemp02;
  276.    }


  277.    /******************************************************************************************************************************************************************
  278.                                                                             标准四向键盘
  279.    *******************************************************************************************************************************************************************/
  280.    
  281.    command_bin_01=0x80;
  282.    
  283.    val01=digitalRead(KEY_UP);//读取数字KEY_UP 口电平值赋给val01
  284.    if(val01==LOW)//检测按键是否按下
  285.    command_bin_01|=0x01;
  286.    
  287.    val02=digitalRead(KEY_LEFT);//读取数字KEY_LEFT 口电平值赋给val02
  288.    if(val02==LOW)//检测按键是否按下
  289.    command_bin_01|=0x02;
  290.    
  291.    val03=digitalRead(KEY_DOWN);//读取数字KEY_DOWN 口电平值赋给val03
  292.    if(val03==LOW)//检测按键是否按下
  293.    command_bin_01|=0x04;
  294.    
  295.    val04=digitalRead(KEY_RIGHT);//读取数字KEY_RIGHT 口电平值赋给val04
  296.    if(val04==LOW)//检测按键是否按下
  297.    command_bin_01|=0x08;

  298.    /******************************************************************************************************************************************************************
  299.                                                                             YXAB四向键盘
  300.    *******************************************************************************************************************************************************************/
  301.    
  302.    val05=digitalRead(KEY_Y);//读取数字KEY_Y 口电平值赋给val05
  303.    if(val05==LOW)//检测按键是否按下
  304.    command_bin_01|=0x10;
  305.    
  306.    val06=digitalRead(KEY_X);//读取数字KEY_X 口电平值赋给val06
  307.    if(val06==LOW)//检测按键是否按下
  308.    command_bin_01|=0x20;
  309.    
  310.    val07=digitalRead(KEY_A);//读取数字KEY_A 口电平值赋给val07
  311.    if(val07==LOW)//检测按键是否按下
  312.    command_bin_01|=0x40;
  313.    
  314.    Serial.print('B');
  315.    Serial.write(command_bin_01);
  316.    
  317.    /******************************************************************************************************************************************************************
  318.                                                                       BLACK,WHITE,BACK,START键盘
  319.    *******************************************************************************************************************************************************************/
  320.    command_bin_02=0x80;
  321.    
  322.    val08=digitalRead(KEY_B);//读取数字KEY_B 口电平值赋给val08
  323.    if(val08==LOW)//检测按键是否按下
  324.    command_bin_02|=0x01;
  325.    
  326.    val09=digitalRead(BUTTON_BLACK);//读取数字BUTTON_BLACK 口电平值赋给val09
  327.    if(val09==LOW)//检测按键是否按下
  328.    command_bin_02|=0x02;
  329.    
  330.    val10=digitalRead(BUTTON_WHITE);//读取数字BUTTON_WHITE 口电平值赋给val10
  331.    if(val10==LOW)//检测按键是否按下
  332.    command_bin_02|=0x04;
  333.    
  334.    val11=digitalRead(BUTTON_BACK);//读取数字BUTTON_BACK 口电平值赋给val11
  335.    if(val11==LOW)//检测按键是否按下
  336.    command_bin_02|=0x08;
  337.    
  338.    val12=digitalRead(BUTTON_START);//读取数字BUTTON_START 口电平值赋给val12
  339.    if(val12==LOW)//检测按键是否按下
  340.    command_bin_02|=0x10;
  341.    
  342.    
  343.    /******************************************************************************************************************************************************************
  344.                                                                  摇杆按键1、2及手柄上方两个模拟按键左、右
  345.    *******************************************************************************************************************************************************************/
  346.    
  347.    
  348.    val13=analogRead(joystick1_key);//读取数字joystick1_key 口电平值赋给val13
  349.    if(val13>=512)//检测按键是否按下
  350.    command_bin_02|=0x20;
  351.    
  352.    val14=analogRead(joystick2_key);//读取数字joystick2_key 口电平值赋给val14
  353.    if(val14>=512)//检测按键是否按下
  354.    command_bin_02|=0x40;

  355.    
  356.    value_wheel_left=analogRead(wheel_left);
  357.    value_wheel_right=analogRead(wheel_right);
  358.    
  359.    value_wheel_left=value_wheel_left/2;
  360.        //通过公式变换为速度值
  361.    value_wheel_right=value_wheel_right/2;
  362.        //通过公式变换为速度值
  363.       
  364.    Serial.write(command_bin_02);
  365.       
  366.    delay(200);

  367.     /************************************************************************************************************************************************************************************************/
  368.     /************************************************************************************************************************************************************************************************/
  369.    
  370.    
  371.     /************************************************************************************************************************************************************************************************/
  372. }
复制代码










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-11-10 21:03:17 | 显示全部楼层
霸气!
回复 支持 反对

使用道具 举报

发表于 2012-11-12 20:22:35 | 显示全部楼层
都是好东西啊  呵呵呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 12:57 , Processed in 0.041131 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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