Pythonスクリプトを介してArduinoNanoからデータを継続的に読み取ろうとしています。ただし、ほとんどの場合、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!"
この時点までは、1つまたは2つのreadlineの後で機能します。手頃な価格です。しかし後で、私はさらにクレイジーなコードを使用しなければなりませんでした。接続が切断されないようにPythonからArduinoに文字を送信すると、ご覧のとおり、Arduinoはその文字を待機する必要があります。Arduinoはその文字を受信した後、必要なデータ(コンマで区切られた数字の文字列)を送り返します。
この最後のPython部分は、例外や破損したデータがなくなるまで、Arduinoから「Y」文字とreadlineを何度も送信するものです。非常に多くのループが無料です。
私が望んでいるのは、常に「ハンドシェイク」を行わずにArduinoから継続的にデータを取得し、そのデータが常にゴミにならないようにする方法です。
そのような方法はありますか?多分シリアルのタイムアウトオプション?