0

我有一个基本的 django 设置正在运行,目前正在实现 dajaxice 调用以将一些数据写入串行连接(RainbowDuino 在另一端)。

以下代码有效,但是当您建立与 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 调用共享连接?

4

1 回答 1

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)中运行,可能需要锁定。

于 2013-03-06T18:01:11.480 回答