PySerial Arduino 接收数据不正确

PySerial Arduino receives data incorrectly

我编写的代码应该将字符串“1”发送到 Arduino。相反,据我所知,它收到“49”,因此两个 IF 语句都不起作用。我究竟做错了什么?我正在使用 Macbook(Mojave)。

Arduino代码如下:

String data;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println(1);
  digitalWrite(13, LOW);
}

void loop() {
  while (Serial.available()) {
      data = Serial.read();
      Serial.println(data);

      if (data == "1") {
          digitalWrite(LED_BUILTIN, HIGH);
          Serial.println("ON");
        } else if (data == "2") {
          digitalWrite(LED_BUILTIN, LOW);
          Serial.println("OFF");
        }

    }
}

这里是 python3 代码:

import serial
import time

ArduinoSerial = serial.Serial('/dev/tty.usbserial-AH06F2WM', 9600)
time.sleep(2)

ArdData = ArduinoSerial.readline().decode('ascii')
print(ArdData)

ArduinoSerial.write("1".encode())

ArdData = ArduinoSerial.readline().decode('ascii')
print(ArdData)

谢谢!

the ASCII table中,十进制值49表示字符'1'

Stringchar是不同的。 Serial.read() 不 return 一个 String。它 return 是 int

您可以使用 Serial.read() 并将 returned 值视为 char。将 String data 更改为 char data 并与 if 语句中的 char 进行比较。

char data; // char

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println(1);
  digitalWrite(13, LOW);
}

void loop() {
  while (Serial.available()) {
      data = Serial.read();
      Serial.println(data);

      if (data == '1') {  // <- '1', not "1"
          digitalWrite(LED_BUILTIN, HIGH);
          Serial.println("ON");
        } else if (data == '2') {  // <- '2', not "2"
          digitalWrite(LED_BUILTIN, LOW);
          Serial.println("OFF");
        }

    }
}

或者,如果你真的想使用 String,你应该使用 Serial.readString()

String data;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println(1);
  digitalWrite(13, LOW);
}

void loop() {
  while (Serial.available()) {
      data = Serial.readString(); // <- readString() not read()
      Serial.println(data);

      if (data == "1") {
          digitalWrite(LED_BUILTIN, HIGH);
          Serial.println("ON");
        } else if (data == "2") {
          digitalWrite(LED_BUILTIN, LOW);
          Serial.println("OFF");
        }

    }
}