我正在尝试通过 Python 脚本不断地从我的Arduino Nano中读取数据。但大多数时候,readline 要么无法抛出异常,要么返回损坏的数据,比如丢失一个数字。
这是连接部分:
Arduino代码:
void loop() {
// Send data only when you receive data:
if (Serial.available() > 0) {
// Check if it's the right signal.
if (Serial.read()=='S') {
// Send a string containing the rows and cols number.
send_rows_cols();
} // if(Serial.read()=='S')
else {
send_data();
} // END: else if( Serial.read()=='Y')
}// if(Serial.available() > 0)
}
在 中send_rows_cols()
,我正在使用Serial.write
,因为它可以工作,但在send_data()
我必须使用Serial.println()
将数据发回。
Python 部分。这是在返回合法值之前我不得不使用的荒谬的运行方式。
import serial
import time
locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3',
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3']
for device in locations:
try:
print "Trying...",device
arduino = serial.Serial(device, 9600)
break
except:
print "Failed to connect on",device
rows_cols =''
try:
while True:
arduino.write('S')
rows_cols = str(arduino.readline())
print len(rows_cols)
print rows_cols
if ( len(rows_cols)>3 ):
break
except:
print "Failed to send!"
到目前为止,它在一到两条 readlines 之后就可以工作了。这是负担得起的。但后来,我不得不使用更疯狂的代码。将一个字符从 Python 发送到 Arduino,这样连接就不会中断,然后您可以看到 Arduino 必须等待该字符。在 Arduino 接收到该字符后,它会发回我想要的数据(一串用逗号分隔的数字)。
最后一个 Python 部分是它一次又一次地从 Arduino 发送“Y”字符和读取行,直到没有异常或损坏的数据。这么多循环无用。
我想要的是一种从我的 Arduino 中连续获取数据的方法,而无需一直进行“握手”,并且这些数据不会一直都是垃圾。
有没有这样的方法?也许串行的超时选项?