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