编辑#2:猜猜看,我快到了!我正面临着似乎是我最后一个问题,好吧,只要涉及到编程。这实际上很有趣,我以前从未遇到过这样的事情。问题出在下面的代码中,我的 javascript 函数。我通常从不发布看起来很容易解决的问题,但我真的不知道这里发生了什么。
问题似乎在于更新功能的第一个条件。看到说 alert('hey'); 的行 ? 好吧,如果我删除那条线,由于某种未知的原因,没有任何东西被发送到动作函数。也不是 Arduino,也不是控制台……什么都没有发生。正如我喜欢这样称呼它,这绝对是令人着迷的。我不知道。我想也许 alert() 造成了读取 arduino 输出所必需的某种延迟,但是当我使用 setTimeout 创建延迟时,也没有任何反应。这太不可思议了。
再来一次:没有警报,动作函数不会被调用,我通过让函数打印一些东西来检查它是否被调用。什么都没有打印,什么都没有。它只是没有被调用。但是有了警报,就会调用该函数,并且 arduino 会打开 LED。
你有什么解释吗?这是我的代码:
function update(command=0) {
// if command send it
if (command!=0) {
$.getJSON('/action?command='+command);
alert('hey');
}
// read no matter what
$.getJSON('/read', {}, function(data) {
if (data.state != 'failure' && data.content != '') {
$('.notice').text(data.content);
$('.notice').hide().fadeIn('slow');
setTimeout(function () { $('.notice').fadeOut(1000); }, 1500);
}
setTimeout(update, 5000);
});
}
update();
我正在尝试创建一个可从任何计算机访问的 Web 界面来控制我的 Arduino。我越来越近了。我的一个问题是,使用以下代码,当我按下按钮向 Arduino 发送命令时,Arduino 确实得到了它(LED按照配置闪烁),然后发送一条消息,Python脚本确实检索数据,但无法正确显示。该字符串遗漏了一些字符,并且index.html
未按需要返回。
基本上,按下按钮时会调用一个函数,并且我需要在与生成结果的函数不同的函数中返回函数的结果。
这是代码:
# -*- coding: utf-8 -*-
import cherrypy, functools, json, uuid, serial, threading, webbrowser, time
try:
ser = serial.Serial('COM4', 9600)
time.sleep(2)
ser.write('1')
except:
print('Arduino not detected. Moving on')
INDEX_HTML = open('index.html', 'r').read()
def timeout(func, args = (), kwargs = {}, timeout_duration = 10, default = None):
class InterruptableThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.result = default
def run(self):
self.result = func(*args, **kwargs)
it = InterruptableThread()
it.start()
it.join(timeout_duration)
if it.isAlive():
return it.result
else:
return it.result
def get_byte(useless):
return ser.read().encode('Utf-8')
def json_yield(command):
@functools.wraps(command)
def _(self, command):
if (command == 'Turn the LED on'):
ser.write('2')
time.sleep(2)
print('wrote to port')
print('ok, ok')
try:
m = ''
while 1:
print('reading...')
byte = timeout(get_byte, ('none',), timeout_duration = 5)
if byte == '*' or byte == None: break
m = m + byte
content = m
time.sleep(1)
return json.dumps({'state': 'ready', 'content':content})
except StopIteration:
return json.dumps({'state': 'done', 'content': None})
return _
class DemoServer(object):
@cherrypy.expose
def index(self):
return INDEX_HTML
@cherrypy.expose
@json_yield
def yell(self):
yield 'nothing'
@cherrypy.expose
@json_yield
def command(self):
yield 'nothing'
if __name__ == '__main__':
t = threading.Timer(0.5, webbrowser.open, args=('http://localhost:8080',))
t.daemon = True
t.start()
cherrypy.quickstart(DemoServer(), config='config.conf')