2012-03-24 10 views
2

PCのシリアルポートにArduinoボードを接続しました。ボードはPCにデータを送信しますが、同じチャンネルで注文を受け取ることもできます。ただし、送信されたデータとオーダーの間には関係はありません。同じPythonプログラムでHTTPリクエストとシリアルチャネルを聴くにはどうすればいいですか?

PCで、私はシリアルポートでリッスンするデーモンを作成しました。 Arduinoにデータを送るために、私はデーモン内にXML RPCサーバーを確立することを考えていました。問題は、私がシリアルポートを聞いて、同じプログラムでXML RPCリクエストに出席する方法を知らないことです。

は当初、私は私の心の中でこのような何かを持っていた:

while true 
    if there is incoming data in the serial channel 
     blah blah 

    if there are HTTP requests 
     start attending the XML RPC request 

を私は(のSimpleXMLRPCServer、web.py)で見てきたサーバはすべての時間を聞いて、要求を処理しています。私は私のXML RPCサーバーに "待機してください、私たちがシリアルチャネルをチェックしようとしているリクエストがないかどうか"を伝えたいと思います。

どうすれば実現できますか?デザインを変更する必要はありますか?私が別のプロセスでXML RPCサーバーを使用している場合、私は何らかのプロセス間通信が必要であると思うので、最初はXML RPCを使用し始めました。

答えて

0

スレッドを持つプログラムを使用できます。いくつかのアクションを並行して実行することができます。あなたは、Pythonを使用している場合

は、あなたはここでより多くの情報を持っている:http://docs.python.org/library/threading.html#thread-objectsスレッドがgrapsに難しいことができ、正しく使用することが

。 Pythonのスレッドに関するチュートリアルはいくつかありますが、検索エンジンでそれらをチェックするのをためらうことはありません。アプローチは非同期I/Oにアプリケーションを移行することです

import threading 

def processCommands(): 
    while True: 
     #wait and process commands 

def readSerial(): 
    while True: 
     #read serial 

serialThread = threading.Thread(target=readSerial) 
commandThread = threading.Thread(target=processCommands) 
serialThread.start() 
commandThread.start() 

#Wait for the command thread to exit, 
#otherwise the programs would immediately exit 
commandThread.join() 
+0

それがより一般的だったので、私はこのアプローチを使用していました。次回は、それについてたくさんの良いことを聞いたので、私はひねったショットをつけます。もしあなたが興味があれば、コードはここにあります:[vr-domotic](https://sourceforge.net/projects/vr-domotic/) – Camotito

2

別の(そしておそらくより良い):

大きなアイデアはそのような何かを行うことです。たとえば、Twistedのようなツイストフレームワークを使用して、別々の2つのプロトコルハンドラでHTTPとシリアルトラフィックを同時に非同期に処理することができます。そのような

何か:

from twisted.web import server, resource 
from twisted.internet import protocol, reactor 
from twisted.internet.serialport import SerialPort 

class Echo(protocol.Protocol): 
    def dataReceived(self, data): 
     self.transport.write(data) 

class HttpResource(resource.Resource): 
    isLeaf = True 

    def render_GET(self, request): 
     request.setHeader("content-type", "text/plain") 
     return "Hello there\n" 

reactor.listenTCP(8080, server.Site(HttpResource())) 
SerialPort(Echo(), <your serial port>, reactor, baudrate=9600) 

reactor.run() 
+0

+1はTwistedのために、これは明らかにこの目的のために作られたフレームワークです – Krumelur