2013-03-06 51 views
0

我有一个基本的Django安装程序正在运行,并且正在执行dajaxice调用,以将一些数据写入串行连接(RainbowDuino位于另一端)。保持dajaxice调用可以使用的持久性串行连接?

下面的代码可以工作,但是当你建立一个到Arduino的串行连接时,你必须等待,随着Arduino的重置向它写入数据。

from django.utils import simplejson 
from dajaxice.decorators import dajaxice_register 
import time, serial 

def serialWrite(msg): 
    try: 
     ser = serial.Serial('/dev/ttyUSB0', 9600) 
     time.sleep(1.5) #wait for arduino to reset 
     ser.write(msg) 
     return "Running Animation" 
    except: 
     return "Failed to communicate with cube" 

@dajaxice_register 
def animate(request, data): 
    msg = serialWrite(str(data)) 
    return simplejson.dumps({'message':msg}) 

我是新来的所有的东西Python和Django的,所以我不知道该如何保持一个持久化对象,可以使用在这种环境下串行连接。从我自己的阅读和测试中,我可以看到dajaxice注册的方法只在收到相应的按钮点击后才被调用。

这是我可以使用我的应用程序的视图实例化串行连接的情况下,如果是这样我怎么能与一个dajaxice调用共享连接?

+0

它可能不是一个理想的设置,但是您是否有建立持久连接的特定原因?可能还有其他方法,但它们真的取决于您的运行时设置(您是如何为您的Django应用程序提供服务的)。一种不同的方法可能是运行一个单独的进程,它建立与Arduino的持久连接,并侦听从Django发送的命令(可能通过Redis)。 – robertklep 2013-03-06 17:12:30

+0

老实说,这只是个人喜好,当4x4 LED立方体刚刚在重置时关闭时,它看起来不太好。目前,django应用程序是从树莓派服务的,这是学校项目的一项要求。我会调查Redis,谢谢你的建议。 – Gybe 2013-03-06 17:47:31

回答

1

如果您的运行时环境很简单,那么中间件可能是一个选项。

// middleware/__init__.py 
class ArduinoMiddleware: 

    def __init__(self): 
     self.serial = serial.Serial('/dev/ttyUSB0', 9600) 
     time.sleep(1.5) 

    def process_request(self, request): 
     request.serialWrite = self.serialWrite 

    def serialWrite(self, msg): 
     try: 
      self.serial.write(msg) 
      return "Running Animation" 
     except: 
      return "Failed to communicate with cube" 

// ajax.py 
@dajaxice_register 
def animate(request, data): 
    msg = request.serialWrite(str(data)) 
    return simplejson.dumps({'message':msg}) 

// settings.py 
... 
MIDDLEWARE_CLASSES = (
    'middleware.ArduinoMiddleware', 
    ... 
) 

未经检验的,如果你在一个多线程环境(如manage.py runserver)运行可能需要锁定。

+0

谢谢,这看起来工作恰到好处。一旦我明天与Arduino进行测试,我一定会接受。 – Gybe 2013-03-06 20:12:51