Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino字符串比较_Arduino_Serial Port_Hc 05 - Fatal编程技术网

Arduino字符串比较

Arduino字符串比较,arduino,serial-port,hc-05,Arduino,Serial Port,Hc 05,我有一些数据通过蓝牙串行输入,我有一个非常简单的if语句来决定下一步要做什么,但它并没有按预期触发。我是个十足的阿杜伊诺新手,有人知道为什么会这样吗 这是日志输出以及完整代码,目前主要怀疑是controlArm方法 日志输出 01:41:37.678 -> A 01:41:37.678 -> 01:41:37.678 -> 01:41:37.678 -> 01:41:37.678 -> Received: A 01:41:37.678 -> contro

我有一些数据通过蓝牙串行输入,我有一个非常简单的if语句来决定下一步要做什么,但它并没有按预期触发。我是个十足的阿杜伊诺新手,有人知道为什么会这样吗

这是日志输出以及完整代码,目前主要怀疑是controlArm方法

日志输出

01:41:37.678 -> A
01:41:37.678 -> 
01:41:37.678 -> 
01:41:37.678 -> 
01:41:37.678 -> Received: A
01:41:37.678 -> controlArm (A)
01:41:37.678 -> Else Move
01:41:37.678 -> moveArm 0 90 45 180 180 90 10
01:41:43.286 -> 1
01:41:43.286 -> 
01:41:43.286 -> 
01:41:43.286 -> 
01:41:43.286 -> Received: 1
01:41:43.286 -> controlArm (1)
01:41:43.286 -> Else Move
01:41:43.286 -> moveArm 0 90 45 180 180 90 10
01:41:47.300 -> 2
01:41:47.300 -> 
01:41:47.300 -> 
01:41:47.300 -> 
01:41:47.300 -> Received: 2
01:41:47.300 -> controlArm (2)
01:41:47.300 -> Else Move
01:41:47.332 -> moveArm 0 90 45 180 180 90 10
完整代码:

#include <SoftwareSerial.h>
#include <Braccio.h>
#include <Servo.h>


Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;

SoftwareSerial Bluetooth(8, 7);
int M0 = 0;
int M1 = 90;
int M2 = 45;
int M3 = 180;
int M4 = 180;
int M5 = 90;
int M6 = 10;

void setup() {  
    Bluetooth.begin(38400);   
  Serial.begin(9600);
  Braccio.begin();
  Braccio.ServoMovement(20,  20, 90, 90, 90, 90,  10); 

}

void moveArm(){
 
  Serial.println("moveArm " + String(M0) + " " + String(M1) + " " + String(M2) + " " + String(M3) + " " + String(M4) + " " + String(M5) + " " + String(M6));
  Braccio.ServoMovement(M0, M1, M2, M3, M4, M5, M6); 
  }



// This is the main suspect
void controlArm(String command){
  Serial.println("controlArm (" + command+")");
  if (command.equals("1")) {
    M6 = 0;
    moveArm();
  } else if (command == '2'){
    M6 = 30;
    moveArm();
  } else if (command == "A"){
    M6 = 73;
    moveArm();
  } else {
    Serial.println("Else Move");
    moveArm();
  }
}
  
  String Data = "";
void loop() {
  while(Bluetooth.available()){
    char character = Bluetooth.read();
    Serial.println(character);
    if (character == '\n'){
        Serial.print("Received: ");
        Serial.println(Data);
        controlArm(String(Data));
        Data = "";
    } else {
      Data.concat(character);
    }
  }

}
#包括
#包括
#包括
伺服底座;
伺服台肩;
伺服弯头;
伺服手腕;
伺服手腕;
伺服夹持器;
软件串行蓝牙(8,7);
int M0=0;
int M1=90;
int M2=45;
int M3=180;
int M4=180;
int M5=90;
int M6=10;
无效设置(){
蓝牙开始(38400);
Serial.begin(9600);
Braccio.begin();
伺服运动(20,20,90,90,90,90,90,90,10);
}
void moveArm(){
Serial.println(“moveArm”+字符串(M0)+“+字符串(M1)+”+字符串(M2)+“+字符串(M3)+”+字符串(M4)+“+字符串(M5)+”+字符串(M6));
伺服运动(M0,M1,M2,M3,M4,M5,M6);
}
//这是主要嫌疑犯
void控制臂(字符串命令){
Serial.println(“controlArm(“+command+”));
if(命令等于(“1”)){
M6=0;
moveArm();
}else if(命令=='2'){
M6=30;
moveArm();
}else if(命令==“A”){
M6=73;
moveArm();
}否则{
Serial.println(“Else-Move”);
moveArm();
}
}
字符串数据=”;
void循环(){
while(Bluetooth.available()){
char character=Bluetooth.read();
Serial.println(字符);
如果(字符=='\n'){
连续打印(“已接收:”);
Serial.println(数据);
控制臂(字符串(数据));
数据=”;
}否则{
数据。concat(字符);
}
}
}

所以我不确定问题出在哪里,但在主循环中有一种更好的方法:

void loop() {
  while(Bluetooth.available()){  
    String Data = Bluetooth.readStringUntil('\n');
    Serial.println(Data);
    controlArm(Data);
  }
}

我不认为这是更好的方式。如果现在结尾没有“/n”,那么程序将暂停一秒钟,等待ReadStringTo超时。您有什么建议吗?我根本不会使用String类。在小型微型计算机上这是一种内存浪费。我也会坚持一次只读一个字符,保持不阻塞。串行数据来得很慢。当你可以阅读一个字符并继续生活,而下一个字符即将上线时,没有理由在等待信息到来时将代码困在那里。谷歌“Arduino Robin2串行输入基础”并花一个晚上阅读。它是关于从串行数据中读取数据的,但这个概念适用于任何流。带“1\n”的字符串不等于“1”。使用
命令。charAt(0)=“1”
。我怀疑string命令中有3个额外的空格字符,例如
“1”
@tim我认为值周围可能也有一些字符,所以我在它周围添加了parans,没有看到任何内容。看起来在调用
moveArm()
之前全局M6没有更新。尝试
volatile int M6=10