PySerial и Arduino неправильно общаются - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу, чтобы Arduino отправлял информацию в сценарий python только тогда, когда Arduino получает правильную команду из сценария python. Кажется, где-то есть недопонимание.

Код Arduino:

char inChar;
bool serial_ready;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available()) {
    // read the incoming byte:
    inChar = Serial.read();
    if (inChar == 'r') {
      Serial.print('L');
    } else {
      Serial.print(inChar);
    }
    serial_ready = false;
  }
}

Python script:

import serial

if __name__ == '__main__':
    ser = serial.Serial('COM4',115200,timeout=0)
    # send signal to arduino
    ser.reset_input_buffer()
    ser.reset_output_buffer()
    try:
        ser.write(b'r')
        while (ser.inWaiting() <= 0):
            print('waiting')
        byte_wait = ser.inWaiting()
        ard_in = ser.read(byte_wait)
        print(ard_in)

    except KeyboardInterrupt:
        print('KeyboardInterrupt')
    ser.close()

Иногда я получаю b'\xf0' через несколько waiting распечатываются (это не то, что я ищу), и иногда оно застревает в l oop и просто печатает waiting, пока я не остановлю его. Почему возвращается b'\xf0' вместо L или r? Почему иногда ничего не возвращается?

Заранее спасибо!

1 Ответ

0 голосов
/ 16 апреля 2020

Здесь тест со встроенным светодиодом и очисткой буфера (работает, только если вы не забиваете данные со стороны фитона);

// Open a serial connection and flash LED when input is received
int ledRed = 13;      // Onboard LED connected to digital pin 13
char inChar;
bool serial_ready;

void setup() {
  pinMode(ledRed, OUTPUT);
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available()) {
    // read the incoming byte:
    digitalWrite(ledRed, HIGH);
    inChar = Serial.read();
    if (inChar == 'r') {
      Serial.print('L');
    } else {
      Serial.print(inChar);
    }
    digitalWrite(ledRed, LOW);
    Serial.flush();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...