Twisted Python script on Raspberry Pi (Debian) to communicate with Arduino via USB
arduino, python, serial-port, twisted
Solution
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
Thus:
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.
Problem
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. 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. 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!