2016-11-02 61 views
0

我想從python do arduino發送數據以通過繼電器控制電機。想法是發送一個數字,以便識別一個動作和一個數值,最後移動它。不幸的是,我正在努力解決一些問題。數據正在迷失。與arduino的pyserial通信(用於電機控制)

因此,在這個最小的例子中有一個標識符「n」,表示接收到的數據是變量「number」,標識符「c」表示接收到的數據是一個計數器。爲了找出問題所在,我將數據發回Python,並嘗試閱讀它。這是設置僅適用於字符的第一個。所有其他數據都會丟失。

有人可以給我一個提示嗎?這些標識符是否必需?我是否需要延遲一段時間(或者也許還有另一個延遲率)?

我想這是關於第二個標識符的東西。該設置工作正常,如果我只與「計數器」例如。

非常感謝您提前!

Pyhton:

import serial 
import time 

Port = "/dev/cu.usbserial-A601FZBL" 
ser = serial.Serial(Port,9600,timeout=1) 

time.sleep(1) 

counter = 0 

def Test(counter): 
    ser.write(b"n") 
    ser.write(str(1).encode()) 
    print("number:", 1) 

    get = ser.readline().decode() 
    print("get:", get)  


    ser.write(b"c") 
    ser.write(str(counter).encode()) 
    print("counter:", counter) 

    get = ser.readline().decode() 
    print("get:", get) 
    print() 


while True: 
    Test(counter) 
    counter += 1 

的Arduino:

void setup() { 
    Serial.begin(9600); 
} 

int number; 
int counter; 

void loop() { 
    if (Serial.available() > 0) { 
    if (Serial.peek() == 'n') { 
     Serial.read(); 
     number = Serial.parseInt(); 
     Serial.println(number); 

     if (Serial.peek() == 'c') { 
     Serial.read(); 
     counter = Serial.parseInt(); 
     Serial.println(counter); 
     } 

     while (Serial.available() > 0) { 
     Serial.read(); 
     } 
    } 
    } 
} 

對不起!這裏是我的樣品運行: (我很困惑,爲什麼有額外的空白行,在輸出打印()旁)

number: 1 
 
get: 1 
 

 

 
counter: 0 
 
get: 
 

 
number: 1 
 
get: 
 
counter: 1 
 
get: 
 

 
number: 1 
 
get: 
 
counter: 2 
 
get: 
 

 
number: 1 
 
get: 
 
counter: 3 
 
get: 
 

 
number: 1 
 
get: 
 
counter: 4 
 
get: 
 

 
number: 1 
 
get: 
 
counter: 5

+1

您的樣品在哪裏運行? – SamB

+0

謝謝SamB,只是添加了它。 –

+1

我認爲你需要把條件*放在while循環中? – SamB

回答

1

感謝您的支持。所以,最後沒有數據丟失;)問題是:在發送數據時,Arduino正在創建一個空行。所以「ser.readline()[: - 2] .decode()」解決了這個問題。當發送大於9的整數時,我遇到了另一個問題。爲此,必須將整數分解爲分隔字符並對它們進行編碼。這裏是我的解決方法:

的Python:

import serial 
import time 

Port = "/dev/cu.usbserial-A601FZBL" 
ser = serial.Serial(Port,9600,timeout=1) 

time.sleep(1) 

counter = 0 

def Test(counter): 
    data = [b"n", b"0", b"c"] 
    value = list(str(counter)) 

    for char in value: 
     data.append(char.encode()) 

    ser.write(data) 
    print("write:", "0", counter) 

    get_1 = ser.readline()[:-2].decode() 
    get_2 = ser.readline()[:-2].decode() 
    print("get: ", get_1, get_2) 
    print() 

while True: 
    Test(counter) 
    counter += 1 

的Arduino:

void setup() { 
 
    Serial.begin(9600); 
 
} 
 

 
int number; 
 
int counter; 
 

 
void loop() { 
 
    while (Serial.available() > 0) { 
 
    if (Serial.peek() == 'n') { 
 
     Serial.read(); 
 
     number = Serial.parseInt(); 
 
     Serial.println(number); 
 

 
     if (Serial.peek() == 'c') { 
 
     Serial.read(); 
 
     counter = Serial.parseInt(); 
 
     Serial.println(counter); 
 
     } 
 

 
     while (Serial.available() > 0) { 
 
     Serial.read(); 
 
     } 
 
    } 
 
    } 
 
}

以及最終輸出:

write: 0 0 
 
get: 0 0 
 

 
write: 0 1 
 
get: 0 1 
 

 
write: 0 2 
 
get: 0 2 
 

 
write: 0 3 
 
get: 0 3 
 

 
write: 0 4 
 
get: 0 4 
 

 
write: 0 5 
 
get: 0 5 
 

 
write: 0 6 
 
get: 0 6 
 

 
write: 0 7 
 
get: 0 7 
 

 
write: 0 8 
 
get: 0 8 
 

 
write: 0 9 
 
get: 0 9 
 

 
write: 0 10 
 
get: 0 10 
 

 
write: 0 11 
 
get: 0 11