4

Python で pyserial を介して Arduino にデータを送信したいと考えています。私が Arduino に実行させたいのは、シリアル ポートから可変長の文字列データを読み取り、Python が読み取れるように書き戻すことだけです。私はそれを行うことができなかったので、以下のコードには Python の文字送信のみが含まれています。Python コードは次のとおりです。

import serial
import sys
import pywapi
import time

def main():
    ser = serial.Serial(3, 9600, timeout=1)
    print "Conn established"
    print "Sending: %s" % "z".__repr__()
    print ser.write('z'.encode("ascii"))
    time.sleep(2)
    print "Received: %s" % ser.read(10).__repr__()         
    ser.close()

Arduinoコードは次のとおりです。

void setup(){
  analogReference(DEFAULT);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available() > 0)
    Serial.println("x");
  while(Serial.available() > 0){
    Serial.print(Serial.read(), BYTE);
  }
}

出力:

Conn established
Sending: 'z'
1
Received: ''

Arduino端末からデータが送信されているときに機能するため、Arduinoのコードが機能することはわかっています。ただし、Python から何かを送信しようとすると失敗します。私は一日中これに苦労してきました。どんな助けでも大歓迎です。

4

4 に答える 4

3

PC で別のシリアル ポートとシリアル通信ソフトウェアを使用して、2 つの部分を個別に検証することをお勧めします。

たとえば、PC に 2 つのシリアル ポートがある場合は、ヌル モデム (ループバック) ケーブルを使用してそれらを接続します。または、com0comを使用して、リンクされた仮想シリアル ポートのペアを作成します。一方のシリアル ポートで Python ソフトウェアを実行し、もう一方のシリアル ポートで端末プログラム (Hyperterminal またはRealTerm ) を実行します。その方法で Python プログラムの動作を手動で確認します。

次に、通常どおり PC を Arduino に直接接続し、ターミナル ソフトウェアを使用して Arduino ソフトウェアの動作を手動で検証します。

そのプロセスにより、問題を絞り込むことができます。両方を確認したら、うまく連携するはずです。

シリアルポートモニター

使用できるもう 1 つの方法は、PC のシリアル ポート ドライバにフックするソフトウェアで、シリアル ポートのトラフィックを監視できます。過去に HHD SoftwareのFree Serial Port Monitorソフトウェアを使用したことがありますが、この目的には十分に機能しました。PC の任意のシリアル ポートを監視し、ポートを介して双方向に送信されるシリアル データのログ (16 進数とテキスト) を表示できます。

于 2010-02-25T04:33:40.817 に答える
3

タイムアウトを増やすか削除して、読み取りのサイズを 1 に設定してみてください。スリープ遅延を増やしたり、単純な読み取りループを実装したりすることもできます。

何かのようなもの:

try:
    while True:
        data = ser.read(1).__repr__()
        if data:
            print "Received: %s." % data
        else:
            print "Looping."
except KeyboardInterrupt:
    print "Done."
except:
    raise
finally:
    ser.close()
    print "Closed port."

次に、ctrl-c を使用して停止します。

于 2010-02-25T01:00:50.687 に答える
0

2 回送信しなければならない理由は、USB 経由で接続している場合、最初のシリアル接続で Arduino がリセットされるためです。

于 2012-05-11T10:52:43.580 に答える
0

送信された文字を、保持されているシリアル バッファからフラッシュする必要がありますか?

キャラクターが実際に COM ポートを離れて Arduino に到達していない可能性があります。これを Arduino ターミナル (開発環境の UI ターミナルのことだと思います) でテストすると、文字列だけでなく、実際に文字列 + 改行を送信していると思います。(つまり、テストで 'z' を入力した後にリターンを押しますか?)

ser.flush() を試すか、\r 文字も送信してください。あなたのテストから、Arduinoは問題なく動作します。何も送信していないように見えるのはpythonプログラムです。

于 2010-02-25T19:05:52.447 に答える