Pysial不会从Arduino获得新价值

Pyserial not getting new value from Arduino

本文关键字:新价值 Arduino Pysial      更新时间:2023-10-16

我正在尝试将数据从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脚本。P>

您应该在阅读后冲洗缓冲区,以确保(接近)使用serial.flushInput()serial.reset_input_buffer()的实时阅读,具体取决于您的版本