Последовательная связь между Python и Arduino

Я работаю над роботом слежения за объектами. Я использую python и OpenCV для обнаружения объекта и отправки соответствующих данных на arduino, который управляет двумя серводвигателями. Данные, которые должны быть отправлены на Arduino, - это углы серводвигателей в диапазоне от 0 до 180. Я использую примеры кодов, чтобы понять, как python и arduino обмениваются данными по последовательной шине. Когда я отправляю одну цифру, arduino получает ее и работает по назначению, но когда я отправляю более одной цифры, ничего не происходит. Это код Arduino:

#include <Servo.h>
int data;
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position

void setup() { 
  Serial.begin(9600); //initialize serial COM at 9600 baudrate
  pinMode(LED_BUILTIN, OUTPUT); //make the LED pin (13) as output
  digitalWrite (LED_BUILTIN, LOW);
  myservo.attach(9);
  Serial.println("Hi!, I am Arduino");
}

void loop() {
while (Serial.available()){
 //to receive more than one character 
 char buffer[] = {' ',' ',' ',' ',' ',' ',' '}; // Receive up to 7 bytes
 while (!Serial.available()); // Wait for characters
 Serial.readBytesUntil('n', buffer, 7);
 data = atoi(buffer);

}
myservo.write(data);
}

А вот код на Python:

import serial
import time  # Required to use delay functions

arduinoSerialData = serial.Serial('com14', 9600)  # Create Serial port 
object called arduinoSerialData
time.sleep(2)  # wait for 2 secounds for the communication to get 
established

print arduinoSerialData.readline()  # read the serial data and print it as 
line
print ("Enter 1 to turn ON LED and 0 to turn OFF LED")

while 1:  # Do this forever

    var = raw_input()  # get input from user
    print "you entered", var  # print the intput for confirmation

    arduinoSerialData.write(var)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
486
1

Ответы 1

'n' в readBytesUntil () должно быть '\ n'.

readBytesUntil () завершается после одного байта, потому что последовательный буфер будет пуст. Если вы хотите, чтобы readBytesUntil () читал весь последовательный буфер, добавьте Serial.setTimeout (), который по умолчанию составляет 1000 миллисекунд для ожидания данных. Это дает время для заполнения последовательного буфера. 1 секунда необязательна, но readBytesUntil () завершится после того, как будет найдено '\ n'.

в то время как (! Serial.available ()); можно удалить.

Я проверю то, что вы сказали завтра, но для ясности: не задержит ли этот тайм-аут весь процесс отслеживания?

Mohammad Nur 08.09.2018 21:24

Нет, он остановится после символа '\ n', а не через 1 секунду.

Finn 08.09.2018 21:26

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