編輯#2:所以猜猜看,我快到了!我正面臨着似乎是我的最後一個問題,好吧,只要編程方面。 這其實很有趣,我以前從來沒有遇到過這樣的事情。 問題出在下面的代碼中,我的javascript函數。我通常不會發布看起來很容易解決的問題,但我真的不知道這裏發生了什麼。Cherrypy和JSON Arduino網絡界面
這個問題似乎是在更新函數的第一個條件。看到說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')
嘿我編輯了我原來的帖子,你能不能請讀,它很短。非常感謝你的幫助。 – user2501169
我的回答已更新 – zmo
嘿最後一個(我希望)更新,這個魅力很強,只是看你自己。 – user2501169