Embedded 无法理解蓝牙控制的bot代码

Embedded 无法理解蓝牙控制的bot代码,embedded,microcontroller,arduino-uno,robotics,Embedded,Microcontroller,Arduino Uno,Robotics,我正在制作一个蓝牙控制的机器人,但我无法编写代码。 所以我在互联网上搜索过,但不明白为什么我们不能直接使用“Serial.read()”的输出,而不是像下面的代码那样使用字符字符串来存储它的值 以下是我看到的代码(来自《电路文摘》): 有4个轮子,因此有4个马达 #define frm1 2 //front right motor #define frm2 3 #define flm1 4 //front left motor #define f

我正在制作一个蓝牙控制的机器人,但我无法编写代码。 所以我在互联网上搜索过,但不明白为什么我们不能直接使用“Serial.read()”的输出,而不是像下面的代码那样使用字符字符串来存储它的值

以下是我看到的代码(来自《电路文摘》): 有4个轮子,因此有4个马达

#define frm1 2         //front right motor
#define frm2 3         
#define flm1 4         //front left motor
#define flm2 5
#define rrm1 6         //rear right motor
#define rrm2 7
#define rlm1 8         //rear left motor
#define rlm2 9

char str[2], i;

void forward()
{
  digitalWrite(frm1, HIGH);
  digitalWrite(frm2, LOW);
  digitalWrite(flm1, HIGH);
  digitalWrite(flm2, LOW);
  digitalWrite(rrm1, HIGH);
  digitalWrite(rrm2, LOW);
  digitalWrite(rlm1, HIGH);
  digitalWrite(rlm2, LOW);
}

void right()
{
  digitalWrite(frm1, LOW);
  digitalWrite(frm2, HIGH);
  digitalWrite(flm1, HIGH);
  digitalWrite(flm2, LOW);
  digitalWrite(rrm1, LOW);
  digitalWrite(rrm2, HIGH);
  digitalWrite(rlm1, HIGH);
  digitalWrite(rlm2, LOW);
}

void backward()
{
  digitalWrite(frm1, LOW);
  digitalWrite(frm2, HIGH);
  digitalWrite(flm1, LOW);
  digitalWrite(flm2, HIGH);
  digitalWrite(rrm1, LOW);
  digitalWrite(rrm2, HIGH);
  digitalWrite(rlm1, LOW);
  digitalWrite(rlm2, HIGH);
}

void left()
{
  digitalWrite(frm1, HIGH);
  digitalWrite(frm2, LOW);
  digitalWrite(flm1, LOW);
  digitalWrite(flm2, HIGH);
  digitalWrite(rrm1, HIGH);
  digitalWrite(rrm2, LOW);
  digitalWrite(rlm1, LOW);
  digitalWrite(rlm2, HIGH);
}

void hault()
{
  digitalWrite(frm1, LOW);
  digitalWrite(frm2, LOW);
  digitalWrite(flm1, LOW);
  digitalWrite(flm2, LOW);
  digitalWrite(rrm1, LOW);
  digitalWrite(rrm2, LOW);
  digitalWrite(rlm1, LOW);
  digitalWrite(rlm2, LOW);
}

void setup() {
  Serial.begin(9600);
  pinMode(frm1, OUTPUT);
  pinMode(frm2, OUTPUT);
  pinMode(flm1, OUTPUT);
  pinMode(flm2, OUTPUT);
  pinMode(rrm1, OUTPUT);
  pinMode(rrm2, OUTPUT);
  pinMode(rlm1, OUTPUT);
  pinMode(rlm2, OUTPUT);
}
这是我不明白的循环。 字符串在这里有什么用途?str[i-1]有什么帮助

void loop() {
  while(Serial.available())
  {
    char ch = Serial.read();
    str[i++] = ch;    

    if(str[i-1] == '1')
    {
      forward();
      i=0;
    }
    else if(str[i-1]== '2')
    {
      left();
      i=0;
    }
    else if(str[i-1] == '3')
    {
      backward();
      i=0;
    }
    else if(str[i-1] == '4')
    {
      right();
      i=0;
    }
    else if(str[i-1] == '5')
    {
      hault();
      i=0;
    }
    delay(100);
  }
}

使用索引变量i没有任何意义。首先,在str[i++]=ch中,作者在str[]中存储字符后增加i,然后立即使用str[i-1]引用添加的字符。然后他们设置i=0,这将清除一开始从未使用过的缓冲区!这里有一个更好的方法:

void loop() {

    while (Serial.available()) {
        switch (Serial.read()) {
            case '1':
                forward();
                break;
            case '2':
                left();
                break;
            case '3':
                backward();
                break;
            case '4':
                right();
                break;
            case '5':
                hault();
                break;
            default:
                break;
        }
        delay(100);
    }

}
请注意,一旦串行数据输入停止,循环(与原始循环一样)将退出。这可能是也可能不是所希望的

还请注意,您可能希望加倍缓冲来自Serial.read()的输入,以避免以更高的波特率丢弃字符-但是,原始代码没有这样做:

void loop() {
    char ch;
    char str[16];
    int i, j = 0;

    // buffer up to 16 chars
    while(Serial.available()) {
        ch = Serial.read();
        str[i++] = ch;
        if (i >= 16)
            break;
    }

    // process buffered characters
    for (j=0; j<i; j++) {
        switch (str[j]) {
            case '1':
                forward();
                break;
            case '2':
                left();
                break;
            case '3':
                backward();
                break;
            case '4':
                right();
                break;
            case '5':
                hault();
                break;
            default:
                break;
        }
        delay(100);
    }
    // reset buffer
    i = 0;
}
void循环(){
char ch;
char-str[16];
int i,j=0;
//最多16个字符的缓冲区
while(Serial.available()){
ch=Serial.read();
str[i++]=ch;
如果(i>=16)
打破
}
//进程缓冲字符

谢谢你!那真的很有帮助!!