2013-01-23 52 views
5

PySerialを使用して全二重通信を実現できますか?具体的には、必要に応じて入力と書き込みのためにポートを連続的に監視することは可能でしょうか?スレッドを使用することが可能でなければならないと思います(シリアルインターフェイスは全二重ではありませんか?)。そうでない場合、シリアルポートを監視して送信しないときには、どのような方法が最適でしょうか?タイムアウトですか?PySerial - 全二重通信

編集:これは私の試みです。このコードはTIのCC2540 Bluetooth LEチップを対象としています。 GATTのinitメッセージを送ることに私は

import serial 
import threading 
from time import sleep 

serial_port = serial.Serial() 

GAP_DeviceInit = \ 
       "\x01\x00\xfe\x26\x08\x03\x00\x00\x00\x00\x00\x00\x00\x00\ 
       \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ 
       \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" 

def read(): 
    while True: 
     data = serial_port.read(9999); 
     if len(data) > 0: 
      print 'Got:', data 

     sleep(0.5) 
     print 'not blocked' 

def main(): 
    serial_port.baudrate = 57600 
    serial_port.port = '/dev/ttyACM0' 
    serial_port.timeout = 0 
    if serial_port.isOpen(): serial_port.close() 
    serial_port.open() 
    t1 = threading.Thread(target=read, args=()) 
    while True: 
     try: 
      command = raw_input('Enter a command to send to the Keyfob: \n\t') 
      if (command == "1"): 
       serial_port.write(message) 
     except KeyboardInterrupt: 
      break 
    serial_port.close() 

答えて

3

はいシリアルポートのハードウェアが全二重ですが、応答が(チップの動作パラメータを詳述)...私は何を取得していないよ期待しています。はい、スレッドを使用してRxとTxを同時に実行できます。あるいは、短いタイムアウトで読み取りを行い、読み取りと書き込みを交互に行う単一のスレッドループを使用することもできます。

+0

あなたは簡単な例を教えてください。または、与えられたコードサンプルで直ちに問題を示すかもしれません。 2番目のアプローチの問題は、いつデータを送信する必要があるかわからないということです。ユーザーはいつでも送信するメッセージを選択できます – stephenfin

+2

あなたは読んだスレッドを開始しませんでした。 't1.start()'を追加してください – TJD

+0

Doh!どうもありがとう! – stephenfin

0

タイムアウトを指定していないため、読み取りでは受信するバイト数が完全に待ってから何も表示されません。