2016-11-02 2 views
0

Я бы хотел отправить данные с python do arduino для управления двигателями через реле. Идея состоит в том, чтобы отправить номер, чтобы идентифицировать двигатель и значение, чтобы, наконец, переместить его. К сожалению, я борюсь с некоторыми проблемами. Данные теряются.pyserial communication with arduino (для управления двигателем)

Итак, в этом минимальном примере есть идентификатор «n», чтобы указать, что принятые данные являются переменной «число» и идентификатором «c», чтобы идентифицировать, что полученные данные являются счетчиком. Чтобы узнать, в чем дело, я отправляю данные обратно на Python и пытаюсь его прочитать. Это настройка работает только для первых символов. Все другие данные теряются.

Может кто-нибудь дать мне подсказку? Необходимы ли эти идентификаторы? Должен ли я устанавливать некоторую задержку(), или, возможно, другую скорость baut?

Я думаю, что это что-то о втором идентификаторе. Настройка работает нормально, если я только работаю с «счетчиком», например.

спасибо, что заблаговременно!

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

Смежные вопросы