Pyserial 仅在有用户输入时与 Arduino 通信

Pyserial only communicate to Arduino when there is a user input

我的 Python 和 Arduino 代码一起产生了最令人困惑的行为。我正在 运行 测试 Pyserial 是否正确地写入和读取我的 Arduino,但似乎 Pyserial 只会在用户输入时写入 Arduino。请注意,此用户输入甚至不需要是发送给 Arduino 的消息,但只要采用此类输入,我打算发送给 Arduino 的任何消息都会发送。如果没有用户输入,似乎是 Pyserial 没有写入 Arduino,或者 Arduino 没有响应串行输入。

这是我的 python 代码:

import serial
import time
arduino = serial.Serial(port='/dev/cu.usbmodem2101', baudrate=9600, timeout=.1)
def write_read(x):
    #arduino.write(bytes(x, "utf-8"))
    arduino.write(b'V6Com9P500zI0zO2zR50zG0zF8zT4zN1zC0r0zZ')
    arduino.flush()
    data1 = arduino.readline()
    time.sleep(0.1)
    data2 = arduino.readline()
    return data1, data2
#num = input("Enter a number: ") # This is the trigger that allows the serial communication
message ="V6Com9P500zI0zO2zR50zG0zF8zT4zN1zC0r0zZ" # dummy message
value1, value2 = write_read(message) 
value1 = value1.decode("utf-8").strip("\r\n")
print(value1) # printing the value
print(value2)


这是我的 Arduino 代码:

int DAC = 1000;
int Velec = 300;
String dataread = "";
boolean readcomplete = false;
String inChar;

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(1);
}

void serialEvent() {
  while (Serial.available()) {
    inChar = Serial.readString();
    dataread += inChar;
    if (inChar == "Z") {
      readcomplete = true;
      Serial.println(dataread); // a testing point
    }
  }
}

void loop() {
  while (readcomplete) {
    Serial.println(DAC);
    Serial.println(dataread);
    readcomplete = false;
  }
}

这些只是测试代码,我去掉了与本题无关的行。如果我在串行监视器中手动输入串行输入,Arduino 代码本身就可以正常工作。

正如我之前所说,如果 'num' 输入没有在 Python 代码中被注释掉,它就可以正常工作:

Enter a number: 8
V6Com9P500zI0zO2zR50zG0zF8zT4zN1zC0r0zZ
b'1000\r\n'

我什至不需要输入数字,我基本上可以输入任何东西,它会起作用。但是一旦我注释掉Python代码中的'num'行,就不会有输出,python代码中的value1和value2将return为空,即使'num' 甚至没有在代码中的其他任何地方使用:


b''

(第一行是空行,因为它被解码并剥离了 \r\n)

我已经在我的 Arduino Uno 和 Arduino Due 上测试过了,所以问题不是电路板。我很困惑,请接受我对任何能对这个问题有所了解的人的真诚感谢。

我在使用 PySerial 和 Arduino 时遇到的一个可能原因是串行通信需要少量时间来初始化,但在提供的代码中,它直接进入 arduino.write() 行。我会尝试在写入前添加大约 10 秒的 time.sleep(),如果可行的话,可以减少延迟。

如果可以的话,我会把它添加为评论,但我还没有足够的声誉。