[英]Pyserial not getting new value from 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);
}
實際上,python的serial.readline()
在獲得EOL之前一直處於阻塞狀態,因此,如果您沒有鎖定問題,則意味着Arduino在緩沖區中寫入的速度比python腳本讀取它的速度更快。
閱讀,以確保(接近)實時與閱讀之后,應該刷新緩沖區serial.flushInput()
或serial.reset_input_buffer()
這取決於你的版本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.