2013-07-19 61 views
4

我一直在研究一個Arduino/Raspberry Pi項目,在那裏我發現自己不僅學習了Python,還學習了扭曲的Python;所以我提前爲我的新生道歉。我現在試圖保持簡單,只是試圖在兩個設備之間的任何時間發送一個字符。Raspberry Pi(Debian)上的Twisted Python腳本通過USB與Arduino進行通信

到目前爲止,我可以從Raspberry Pi發送到Arduino,並像預期的那樣有效地關閉/打開LED。然而,我似乎無法生成Twisted代碼,它將檢測到任何來自Arduino的任何事情到串口上的RPi。我驗證了Arduino每隔2秒發送一個字符,並在RPi上運行的Arduino程序員中使用串口監視器應用程序。

下面的代碼在RPi上運行,接收GET請求並通過串口將一些數據傳遞給Arduino。我似乎無法得到這個代碼來聽同樣的串口。 :/我一直在這個工作了一個多月,似乎卡住了。我似乎無法找到一個扭曲的Python在線接收串行數據的好例子;或者至少是我理解的一個例子。反正這裏是我到目前爲止有:

import sys 
from urlparse import urlparse 
from twisted.web import server, resource 
from twisted.internet import reactor 
from twisted.internet.protocol import Factory, Protocol 
from twisted.internet.serialport import SerialPort 

serServ = None 

class USBclient(Protocol): 
    def connectionMade(self): 
     global serServ 
     serServ = self 
     print 'Arduino device: ', serServ, ' is connected.' 

    def cmdReceived(self, cmd): 
     serServ.transport.write(cmd) 
     print cmd, ' - sent to Arduino.' 
     pass 

    def serialReadEvent(self):  #maybe it should be: doRead()? Couldn't get either to work. 
     print 'data from arduino is at the serial port!' 

class HTTPserver(resource.Resource): 
    isLeaf = True 
    def render_GET(self, request):  #passes the data from the get request 
     print 'HTTP request received' 
     myArduino = USBclient() 
     stringit = str(request) 
     parse = stringit.split() 
     command, path, version = parse 
     myArduino.cmdReceived(path) 

class cmdTransport(Protocol): 
    def __init__(self, factory): 
     self.factory = factory 

class cmdTransportFactory(Factory): 
    protocol = cmdTransport 

if __name__ == '__main__': 
    HTTPsetup = server.Site(HTTPserver()) 
    reactor.listenTCP(5000, HTTPsetup) 
    SerialPort(USBclient(), '/dev/ttyACM0', reactor, baudrate='115200') 
    reactor.run() 

正如你所看到的代碼只是爲了尋找串行端口上的任何東西,但我似乎無法使那魔術發生。在此先感謝,任何幫助表示讚賞!

回答

2

由此看來:您的協議的子類的http://twistedmatrix.com/trac/browser/tags/releases/twisted-12.3.0/twisted/internet/_win32serialport.py#L84你應該看dataReceived(個體經營,...)方法

這樣:

class USBclient(Protocol): 
    def connectionMade(self): 
     global serServ 
     serServ = self 
     print 'Arduino device: ', serServ, ' is connected.' 

    def cmdReceived(self, cmd): 
     serServ.transport.write(cmd) 
     print cmd, ' - sent to Arduino.' 
     pass 

    def dataReceived(self,data):  
     print 'USBclient.dataReceived called with:' 
     print str(data) 

試試這個,看看它是否工作。

+0

調試時,應始終使用'print repr(data)',以便任何有趣的控制字符都能被轉義並清晰可見。 – Glyph

+0

太棒了!這正是我正在尋找的東西,讓它馬上工作。謝謝您的幫助! :D – user2598150

+0

雕紋,我知道。手指滑落:) – jbreicis