2016-11-02 49 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