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()
,如果可行的话,可以减少延迟。
如果可以的话,我会把它添加为评论,但我还没有足够的声誉。
我的 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()
,如果可行的话,可以减少延迟。
如果可以的话,我会把它添加为评论,但我还没有足够的声誉。