Пизериальная связь с 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