Python — Pyserial не получает новое значение от Arduino

Я пытаюсь передать данные с ультразвукового дальномера на Arduino на мой ноутбук. Кажется, у меня проблема с получением новой стоимости от Arduino. Когда я запускаю скрипт Python, он начинает печатать данные, как я и надеялся. Однако эти данные не меняются, когда я изменяю расстояние, которое видит датчик, это почти как serial.readline() застрял на одном из первых значений. Я новичок в этой серийной связи, поэтому любая помощь очень ценится!

Код ниже, и для здравого смысла я проверил, что датчик работает с последовательным монитором в Arduino IDE.

import numpy
import serial
import time
import sys
import cv2
import pickle

#set up the camera stuff
cap = cv2.VideoCapture(0)

#container for images
images=[]

#container for distances
distances=[]

#first frame number
frame_num=1

#setup the serial connection and pause to establish it
ser = serial.Serial('/dev/cu.usbmodem1421', 9600,timeout=1)

time.sleep(5)

while True:
try:
#grab and image
ret,frame=cap.read()

#grab the distance
distance=ser.readline()
print(distance)

#process the image to a gray and 1241,376
#gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#gray_resized=cv2.resize(gray,(1241,376))

#cv2.imshow("FRAME",gray_resized)
#print(distance)

#images.append([frame_num,gray_resized])
#distances.append([frame_num,distance])

#ser.flush()

except KeyboardInterrupt:
#pickle.dump( images, open( "save.p", "wb" ) )
#pickle.dump( distances, open( "save.p", "wb" ) )
sys.exit()

Код Arduino:

// defines pins numbers
const int trigPin = 7;
const int echoPin = 8;

// defines variables
long duration;
int distance;

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
delayMicroseconds(50);
}

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance in CM
distance= duration*0.034/2;
String distance_out=String(distance);

// Prints the distance on the Serial Monitor in CM
Serial.println(distance);
Serial.flush();

//Serial.print("Distance: ");
//Serial.println(distance);
}

0

Решение

На самом деле, питона serial.readline() блокируется, пока не получит EOL, поэтому, если у вас нет проблемы с блокировкой, это означает, что Arduino записывает в буфер быстрее, чем ваш скрипт Python читает его.

Вы должны очистить буфер после чтения, чтобы гарантировать (близко к) чтение в реальном времени с serial.flushInput() или же serial.reset_input_buffer() в зависимости от вашей версии

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]