我的Python和Arduino代码一起产生了最令人困惑的行为。我正在运行一个测试,看看Pyserial是否正确地写入和读取我的Arduino,但似乎Pyserial只会在用户输入时写入Arduino。注意,这个用户输入甚至不需要是发送给Arduino的消息,但只要接受了这样的输入,我想发送给Aruino的任何消息都会发送。如果没有用户输入,那么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("rn")
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代码本身工作良好。
正如我之前所说的,如果在Python代码中没有注释掉"num"输入,它就可以正常工作:
Enter a number: 8
V6Com9P500zI0zO2zR50zG0zF8zT4zN1zC0r0zZ
b'1000rn'
我甚至不需要输入数字,我基本上可以输入任何东西,而且它会起作用。但是,一旦我注释掉Python代码中的"num"行,就不会有输出,Python代码的value1和value2将返回空,即使代码中的其他任何地方都没有使用"num":
b''
(第一行是空行,因为它被解码并去掉了。\r\n(
我已经在我的Arduino Uno和Arduino Due上测试过了,所以问题不在于董事会。我很困惑,请接受我对任何能在这个问题上提供最细微信息的人的真诚感谢。
在使用PySerial和Arduino时,我遇到的一个可能原因是串行通信需要很短的时间才能初始化,但在提供的代码中,它直接到达arduino.write()
行。我会尝试在写之前添加一个大约10秒的time.sleep()
,如果它有效的话,可以减少延迟。
如果可以的话,我会添加这条评论,但我还没有足够的声誉。