2017-06-03 21 views
0

我正在構建一個需要從運行django web應用程序的Raspberry Pi服務器狀態的arduino項目。該Web應用程序很簡單,它將一個開關的狀態存儲在數據庫中(True或False意思是On或Off)。我有一個視圖,返回簡單的字符串,狀態爲「狀態:1」或「狀態:0」。Django http有時會響應包含unicode字符的長字符串

問題是,有時來自服務器的響應是由包含unicode字符的長字符串組成的。當我從Arduino IDE串行監視器複製粘貼它們時,我不知道這些字符,它們看起來像這樣:'⸮'。 arduino代碼重複加載此頁面並檢查狀態以更新項目中的硬件。這個字符串的長度是完全隨機的,有時甚至是無限的。發生也是隨機的,所以我無法預測它何時發生,爲什麼會發生。

它造成我的問題是,我解析從我的arduino服務器的響應,當這個無限字符串發生板上的程序凍結,因爲它永遠解析它實際。這簡直是​​不能接受的。

讀取從Arduino的服務器響應的代碼是:

while(client.connected() || client.available()){ 
    char c = client.read(); 
    Serial.print(c); 
} 

這不是我用解析響應代碼,它只是代碼我用來找出由outputing是什麼問題響應。我正在連接串行監視器窗口的屏幕,以便您可以看到問題(問題結束時)。爲了解析響應,我使用了TextFinder。

創建在Django響應視圖代碼:

def state(request, room_name): 
    room = Light.objects.get(light_name=room_name) 
    out = "" 
    if room.light_status: 
    out = "Status:1\t" 
    else: 
    out = "Status:0\t" 
    return HttpResponse(out) 

做任何你有任何想法,這可能是造成這個問題呢?

我還有一個問題可能與這個問題有關,但我不確定。有時候響應值是錯誤的,導致LED閃爍(只是在隨機時間進行一次迭代,這可能是由服務器知道的延遲引起的)。

編輯:我認爲該字符的ASCII值可能有一定的用處。它是255(最後一個ASCII字符)。

The screen of the response in Arduino Serial Monitor

回答

0

的首先你out應該是一個字典即out = {"Status":"1"}等。其次,對於你的問題,你可以刪除所有非ASCII字符作爲 Remove Non Ascii characters

只需更換white-space空即''

+0

out是字符串故意,HttpResponse需要字符串返回相同的方式,它需要以字符串形式的HTML頁面,如果我想要完整的網頁。 這就是問題,我輸出的字符串中沒有非ASCII字符,它是硬編碼的字符串,因此不能有任何字符。 你的意思是哪個白色空格? – Dominik

+0

我給出的鏈接是這個人正在使用'white-space'替換非ascii字符,所以你可以只使用一個空字符串''''。 –

+0

是的,太棒了!但它仍然不能解釋爲什麼如果我將硬編碼字符串作爲不包含任何非ascii字符的輸出發送非ASCII字符。我正在以「狀態:1」格式響應字符串,那裏有沒有非ascii字符? – Dominik