4

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から継続的にデータを取得し、そのデータが常にゴミにならないようにする方法です。

そのような方法はありますか?多分シリアルのタイムアウトオプション?

4

1 に答える 1

4

Arduino IDEシリアルモニターも開いていませんか?「PythonからArduinoへのインターフェースコード」のデバッグを「幸せな」夜に過ごした後、それを開いたままにして、たまに文字を食べていたことに気づきました:)

私は確かに非常にシンプルなコードを使用Serial.write()Serial.println()readline()、一度に数十分の継続的な「コマンド/応答」テストを実行しました(数千行の送受信)

于 2012-07-03T08:12:16.687 に答える