Raspberry Pi (Debian) 上的 Twisted Python 脚本以通过 USB 与 Arduino 通信

Raspberry Pi (Debian) 上的 Twisted Python 脚本以通过 USB 与 Arduino 通信

问题描述:

我一直在研究 Arduino/Raspberry Pi 项目,我发现自己不仅在学习 Python,还学习了 Twisted Python;所以我提前为我的新手道歉.我现在尽量保持简单,只是尝试在两个设备之间随时发送一个字符.

I have been working on an Arduino/Raspberry Pi project where I have found myself learning not just Python but Twisted Python as well; so I apologize in advance for my newbness. I am trying to keep it simple for now and just trying to send a char at any one time between the two devices.

到目前为止,我能够从 Raspberry Pi 发送到 Arduino 并按预期有效地关闭/打开其 LED.但是,我似乎无法生成 Twisted 代码,该代码将检测从 Arduino 到串行端口上的 RPi 的任何内容.我验证了 Arduino 每 2 秒发送一次字符,使用在 RPi 上运行的 Arduino 编程器中的串行监视器应用程序.

So far I am able to send from the Raspberry Pi to the Arduino and effectively turn its LED off/on just as expected. However I cannot seem to generate Twisted code which will detect anything coming from the Arduino to the RPi on the serial port. I verified that the Arduino is sending chars every 2 seconds with a serial monitor application in the Arduino programmer running on the RPi.

下面的代码在 RPi 上运行,接收 GET 请求并将其中一些数据通过串行端口传递到 Arduino.不过,我似乎无法让此代码侦听同一个串行端口.:/我已经为此工作了一个多月,但似乎卡住了.我似乎找不到在线 Twisted Python 接收串行数据的好例子;或者至少是我理解的一个例子.无论如何,这是我到目前为止所拥有的:

The code below runs on the RPi, receives a GET request and passes some of that data through the serial port to the Arduino. I cannot seem to get this code to listen to that same serial port though. :/ I have been working on this for a bit over a month and seem to be stuck. I just cannot seem to find a good example for Twisted Python online to receive serial data; or at least an example that I understand. Anyway here is what I have so far:

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()

如您所见,代码只是在串行端口上查找任何内容,但我似乎无法实现这种魔力.提前致谢,感谢您的帮助!

As you can see the code is just looking for anything on the serial port but I can't seem to make that magic happen. Thanks in advance, any help is appreciated!

由此判断:http://twistedmatrix.com/trac/browser/tags/releases/twisted-12.3.0/twisted/internet/_win32serialport.py#L84你应该查看您的协议子类的 dataReceived(self,...) 方法

Judging from this: http://twistedmatrix.com/trac/browser/tags/releases/twisted-12.3.0/twisted/internet/_win32serialport.py#L84 you should be looking at dataReceived(self,...) method of your Protocol subclass

因此:

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)

试试这个,看看它是否有效.

try this to see if it works.