2

pySerialを使用して、USB-RS232 コンバーター経​​由でデバイスと通信しようとしています。

私の最初のテストは、プログラムの残りの部分との通信クラスの統合をテストするために、通信をやめてデータポイントを「発明」することでした。

def run(self):
    import random
    while True:
        self.callback(random.ranint(MIN, MAX))

うまくいきました。ここで、「短絡」通信をテストしたいと思います。つまり、ピン 2 と 3 をショートして (フロー制御はありません)、送信しているものを受信します。

これは では正常に機能しますminicomが、私のコードでは機能しません:

def run(self):
    while True:
        self.ser.write('a')
        print self.ser.read(size=1)

読み取りおよび書き込みのタイムアウトは 0 に設定されます。

timeout = なし: 永久に待機する
timeout = 0: ノンブロッキング モード (読み取り時にすぐに戻る)
timeout = x: タイムアウトを x 秒に設定する (float を許可)

ここに画像の説明を入力

を呼び出した後、プログラムがハングしwrite()ます。私は何を取りこぼしたか?

4

1 に答える 1

0

ライブラリのテストからのコードを次に示します。

def test2_Loopback(self):
"""timeout: each sent character should return (binary test).
this is also a test for the binary capability of a port."""
    for block in segments(bytes_0to255):
        length = len(block)
        self.s.write(block)
        # there might be a small delay until the character is ready (especially on win32)
        time.sleep(0.05)
        self.failUnlessEqual(self.s.inWaiting(), length, "expected exactly %d character for inWainting()" % length)
        self.failUnlessEqual(self.s.read(length), block)#, "expected a %r which was written before" % block)
    self.failUnlessEqual(self.s.read(1), data(''), "expected empty buffer after all sent chars are read")

ここから。私が見逃していたのは途中のコメントだったようです。

編集:以下のsawdustのコメントは、この問題をより適切な方法で解決します。代わりにそれを使用してください。


そして今、本当の解決策のために。

私の問題は非常にばかげていることがわかりました。やっていた:

  1. タイムアウトまたは読み取りと書き込みなしでポートを開きます
  2. の無限ループを実行するwrite()と、read()
  3. ナイフまたはペーパークリップで RX と TX を短絡します。
  4. 待って、なぜすべてが凍っているのか頭をかきむしる

何が起こっていたか: 書き込みは成功しましたが、データが失われました (RX と TX がまだ結合されていなかったため)。次に、read() がフリーズし、何かが聞こえるのを待ちます。

最初にピンを短絡してからテスト実行することで解決しました。

于 2013-09-11T11:29:44.483 に答える