【问题标题】:Twisted Python script on Raspberry Pi (Debian) to communicate with Arduino via USBRaspberry Pi (Debian) 上的 Twisted Python 脚本通过 USB 与 Arduino 通信
【发布时间】:2013-07-19 07:03:20
【问题描述】:

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

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

下面的代码在 RPi 上运行,接收 GET 请求并通过串行端口将部分数据传递给 Arduino。不过,我似乎无法让这段代码监听同一个串行端口。 :/我已经为此工作了一个多月,似乎被卡住了。我似乎无法找到一个在线 Twisted 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()

正如您所见,代码只是在串行端口上寻找任何东西,但我似乎无法让这种魔法发生。提前致谢,感谢您的帮助!

【问题讨论】:

    标签: python serial-port arduino twisted


    【解决方案1】:

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

    因此:

    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)
    

    试试这个看看它是否有效。

    【讨论】:

    • 调试时你应该总是使用print repr(data),这样任何有趣的控制字符都会被转义并且清晰可见。
    • 太棒了!这正是我正在寻找的,让它立即工作。谢谢您的帮助! :D
    • 字形,我知道。手指滑了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多