Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyserial未从Arduino获取新值_Python_C++_Arduino_Pyserial - Fatal编程技术网

Python Pyserial未从Arduino获取新值

Python Pyserial未从Arduino获取新值,python,c++,arduino,pyserial,Python,C++,Arduino,Pyserial,我正试图将数据从Arduino上的超声波测距仪传输到我的笔记本电脑。我似乎对从Arduino获取新值有意见。当我启动Python脚本时,它开始像我希望的那样打印数据。但是,当我改变传感器看到的距离时,这些数据不会改变,这几乎就像serial.readline()。我是新的串行通信的东西,所以任何帮助都非常感谢 代码如下,为了安全起见,我检查了传感器是否与Arduino IDE中的串行监视器一起工作 import numpy import serial import time import sy

我正试图将数据从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\u input\u buffer()
进行实时读取,具体取决于您的版本

可能您尝试读取的数据量超过可用数据量,那么典型的结果是,您将进入睡眠状态,直到获得所需的数据量。尝试使用单字节的
os.read()
而不是
stream.read()
stream.readline()
。我以前从未使用过os.read(),参数是什么?
help(os.read)
说:
read(fd,buffersize)
fd
将是一个int;例如,您可以从
cap.fileno()
获取它。
buffersize
可以是
1
以逐字节读取。效率不高,但可能是找出问题所在的方法。好的,谢谢,我会看看我能解决什么问题!