Я работаю над роботом слежения за объектами. Я использую 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)
'n' в readBytesUntil () должно быть '\ n'.
readBytesUntil () завершается после одного байта, потому что последовательный буфер будет пуст. Если вы хотите, чтобы readBytesUntil () читал весь последовательный буфер, добавьте Serial.setTimeout (), который по умолчанию составляет 1000 миллисекунд для ожидания данных. Это дает время для заполнения последовательного буфера. 1 секунда необязательна, но readBytesUntil () завершится после того, как будет найдено '\ n'.
в то время как (! Serial.available ()); можно удалить.
Нет, он остановится после символа '\ n', а не через 1 секунду.
Я проверю то, что вы сказали завтра, но для ясности: не задержит ли этот тайм-аут весь процесс отслеживания?