无线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);
/************************************************************************************************************************************************************************************************/
/************************************************************************************************************************************************************************************************/
/************************************************************************************************************************************************************************************************/
}
:funk:霸气! 都是好东西啊呵呵呵呵
页:
[1]