Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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
从Arduino的串行端口将实时数据读入python脚本_Python_Opencv_Serial Port_Pyserial - Fatal编程技术网

从Arduino的串行端口将实时数据读入python脚本

从Arduino的串行端口将实时数据读入python脚本,python,opencv,serial-port,pyserial,Python,Opencv,Serial Port,Pyserial,我正试图通过Pyserial lib从Arduino读取数据。我遇到了一个问题,它拒绝访问COM端口来读取数据 python脚本是一个用于跟踪对象的OpenCV程序,它请求一个边界框,然后在摄影机流中跟踪该框。它还将向屏幕输出连接到Arduino的红外传感器读取的距离 我试图清除Arduino代码并再次闪烁,但没有用。我关闭了串行监视器,这似乎有一次帮助,但由于某种原因它无法再次工作 arduino代码是: #include <SharpIR.h> SharpIR DETECTORs

我正试图通过Pyserial lib从Arduino读取数据。我遇到了一个问题,它拒绝访问COM端口来读取数据

python脚本是一个用于跟踪对象的OpenCV程序,它请求一个边界框,然后在摄影机流中跟踪该框。它还将向屏幕输出连接到Arduino的红外传感器读取的距离

我试图清除Arduino代码并再次闪烁,但没有用。我关闭了串行监视器,这似乎有一次帮助,但由于某种原因它无法再次工作

arduino代码是:

#include <SharpIR.h>
SharpIR DETECTORsensor( SharpIR::GP2Y0A21YK0F, A0 );

void setup()
{
  Serial.begin( 9600 );
}

void loop()
{
  int distance = DETECTORsensor.getDistance(); 
  Serial.println( distance );
  delay(500);
}
错误是:

文件 “C:\Users\XXX\Anaconda3\envs\py36\lib\site packages\serial\serialwin32.py”, 第62行,打开 引发SerialException(“无法打开端口{!r}:{!r}”)。格式(self.portstr,ctypes.WinError())

SerialException:无法打开端口“COM3”:PermissionError(13, “访问被拒绝。”,无,5)


我怀疑这是因为主循环中有
seru data=serial.serial(“COM3”,9600)
。这意味着在第二个循环中,它将尝试打开一个已经在使用的连接。所以它被否认了。您应该将该行移出主循环,并在脚本结束时正确关闭它

或者,您可以使用

with serial.Serial() as ser:
    [loop here]
您还应该知道,当前代码没有从串行连接读取任何数据。为此,您必须使用
read()


我建议您首先创建一个可以读取IR数据的小脚本,这样您就知道它是有效的。文档非常有用,请阅读。

我怀疑这是因为您的主循环中有
seru data=serial.serial(“COM3”,9600)
。这意味着在第二个循环中,它将尝试打开一个已经在使用的连接。所以它被否认了。您应该将该行移出主循环,并在脚本结束时正确关闭它

或者,您可以使用

with serial.Serial() as ser:
    [loop here]
您还应该知道,当前代码没有从串行连接读取任何数据。为此,您必须使用
read()


我建议您首先创建一个可以读取IR数据的小脚本,这样您就知道它是有效的。该文档非常有帮助,请阅读。

以下是您可能用于测试串行端口的最低限度代码。阿杜伊诺密码

void setup()
{
Serial.begin(9600);
}
void循环()
{
整数距离=123;
串行打印LN(距离);
延迟(500);
}
还有Python脚本

从串行导入串行
port=“COM3”
波特率=9600
串行(端口=端口,波特率=波特率,超时=1)作为端口系列:
如果端口_serie.isOpen():
port_serie.flush()
对于范围(20)内的i:
尝试:
ligne=port_serie.readline()
打印(str(ligne))
除:
打印(“例外”)
port_系列关闭()

此最小代码仅在20次迭代中运行。我删除了
而不是True
,因为我不喜欢调试时可能出现的无限循环。如果脚本运行正常,您可以在时使用
,在Arduino上包含所有视频内容和距离检测

以下是您可能用于测试串行端口的最低代码。阿杜伊诺密码

void setup()
{
Serial.begin(9600);
}
void循环()
{
整数距离=123;
串行打印LN(距离);
延迟(500);
}
还有Python脚本

从串行导入串行
port=“COM3”
波特率=9600
串行(端口=端口,波特率=波特率,超时=1)作为端口系列:
如果端口_serie.isOpen():
port_serie.flush()
对于范围(20)内的i:
尝试:
ligne=port_serie.readline()
打印(str(ligne))
除:
打印(“例外”)
port_系列关闭()

此最小代码仅在20次迭代中运行。我删除了
而不是True
,因为我不喜欢调试时可能出现的无限循环。如果脚本有效,那么您可以在使用
的同时
,在Arduino上包含所有视频内容和距离检测

,也许您应该尝试创建一个最小的示例,以帮助我们更清楚地看到。例如,我不确定代码的视频或cv2部分是否对idea@RomainF的问题有任何兴趣,我确实尝试了一个最小的例子,正如你所建议的,但是在第一圈之后端口仍然断开,python脚本的输出与串行监视器的输出不同import serial ser=serial.serial(“COM3”,9600)data=ser.read()print(data)`这输出b+一些随机值编辑:输出只是一个由各种下线字符和串行监视器附加到其显示值的其他内容组成的字符串,该问题已解决。然而,即使在一个最小的例子上进行测试,也仍然存在只能阅读一次的问题。也许你应该尝试创建一个最小的例子来帮助我们看得更清楚。例如,我不确定代码的视频或cv2部分是否对idea@RomainF的问题有任何兴趣,我确实尝试了一个最小的例子,正如你所建议的,但是在第一圈之后端口仍然断开,python脚本的输出与串行监视器的输出不同import serial ser=serial.serial(“COM3”,9600)data=ser.read()print(data)`这输出b+一些随机值编辑:输出只是一个由各种下线字符和串行监视器附加到其显示值的其他内容组成的字符串,该问题已解决。但是,即使在最小的示例上进行测试,也仍然存在只能读取一次的问题。非常感谢您指出J.D.,但是问题仍然存在,因为我无法多次读取该值,并且只能读取一次,输出与串行监视器中的输出完全不同。编辑:输出只是由各种下线字符和其他字符组成的字符串
x = ser.read()          # read one byte
s = ser.read(10)        # read up to ten bytes (timeout)