1

コンピューターにデータをシリアルに送信するようにArduinoをプログラムしました。pySerialはシリアルから正しく読み取っていますが、常に最新の情報が必要なため、flushInput()を使用して入力バッファーをフラッシュできると思いましたが、コマンドを実行すると、から読み取ることができなくなりました。シリアル。Arduinoが次のデータパケット(57600ボーで実行)を送信するのに十分な時間を確保できるように、51回ごとにフラッシュすることを試みました(51は素数であり、カウンターをリセットしなくても簡単に51回カウントできるため)。 )、しかしまだ機能していません。つまり、deadline()を使用して読み取り行の長さを格納する変数を使用しましたが、51に到達して入力バッファーがフラッシュされるとすぐに、常に0の読み取り値を取得します。これは、何も読み取っていないことを意味します。pySerialのドキュメントを読みました。しかし、関連する情報は見つかりませんでした。flushInput()はシリアル接続も終了しますか?どうもありがとう。

編集:私はMacOS10.7.5とPython2.7.3を実行しています

try:
    self.s = serial.Serial("/dev/tty.usbmodemfa131", 57600, timeout = 0)
    self.FlightLoopCB = self.FlightLoopCallback
    XPLMRegisterFlightLoopCallback(self, self.FlightLoopCB, self.interval, 0)
except serial.SerialException:
    self.s = None
    .
    .
    .

    self.length=0
    self.myline=self.s.readline()
    self.length=len(self.myline)
    print "Test: %i %i" % (self.length, self.j)
    if(self.length>=7):
        if(self.myline[0:2]=="R,"):
            if(self.j%51==0):
                self.s.flushInput()

            self.length=len(self.myline)
            self.myline=self.myline[2:6]
            self.myLineBytes=[0,0]

            self.myLineBytes[0]=unpack('>H', self.myline[0:2])
            self.myLineBytes[1]=unpack('>H', self.myline[2:4])
4

1 に答える 1

9

Serial.flushInput()ストリームも閉じますか?

だから私はpySerialのコードを掘り下げました(それは利用可能です、あなたはそれをSVNに引っ張ることができます、あなたが理解しようとしているさらなる問題がある場合はそうすることをお勧めします)。

OSX を使用しているため、python はos.name「posix」と報告するためserial.Serial、実際にはserial.serialposix.Serial. そのための定義flushInput()は次のとおりです。

def flushInput(self):
    """Clear input buffer, discarding all that is in the buffer."""
    if not self._isOpen: raise portNotOpenError
    termios.tcflush(self.fd, TERMIOS.TCIFLUSH)

(見たい方はこちらの500番線まで)

したがって、本質的には単なるラッパーtermios.tcflush()です。そのためのドキュメントには、次のように書かれています。

termios.tcflush(fd, キュー)

ファイル記述子 fd でキューに入れられたデータを破棄します。キュー セレクターは、入力キューの TCIFLUSH、出力キューの TCOFLUSH、または両方のキューの TCIOFLUSH のうち、どのキューを指定するかを指定します。

ドキュメントによると、基になるストリームを閉じ、データのみを破棄します。それはおそらく、最初に期待していた動作です。

これは、おそらくあなたのコードに何か他の問題があると私に言わせます。正確に問題が何であるかを推測できるように投稿されたコードが十分ではありません。

これは単なる推測ですが、インクリメントするコードがself.j51 に達した後に呼び出されないブロック内にある可能性があるため、常にフラッシュしていますか? 問題を引き起こす完全なコード例を投稿できれば(おそらく、あなたが見ているこの問題を実行するだけのコードのいくつかの削減されたセット)、私はおそらく助けることができます.

PS -- 時期尚早の最適化に関する注意:

シリアル インターフェイスのもう一方の端でデータを生成しているものが、消費している速度よりもはるかに高速でデータを生成していない限り、大量のデータがバッファに蓄積されることはないため、そもそもフラッシュする必要はないでしょう。 . どういうわけか、57600 ボーで動作するシリアル インターフェイスでそれができるとは思えません。フラッシュを実行する前に、最初にフラッシュが実際に必要であることを確認する必要があります。

必要かもしれない、または「念のために」と思うからといって、それを行わないでください。それを行う前に、実際に問題を解決していることを確認してください。そうでない場合、これは時期尚早の最適化であり、理由もなくコードの複雑さと脆弱性を増加させるだけです。

于 2013-02-24T20:47:22.780 に答える