Пизериальная связь с Arduino (для управления двигателем)

Я хотел бы отправить данные из Python Do Arduino для управления двигателями через реле. Идея состоит в том, чтобы отправить число, чтобы идентифицировать мотор и значение, чтобы, наконец, переместить его. К сожалению, я борюсь с некоторыми проблемами. Данные теряются.

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

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

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

Заранее большое спасибо!

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();
      }
    }
  }
}

Сожалею! Вот мой пример: (я запутался, почему в выводе есть дополнительные пустые строки, кроме print())

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 ответ

Спасибо за поддержку. Итак, наконец, никакие данные не потерялись;) Проблема была в том, что 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

Другие вопросы по тегам