我正在从串行端口读取数据,由 arduino 发送。
我有两个文件,我分别使用它们来编写一些代码并尝试不同的东西。在其中一个中,我读取数据并使用 matplotlib 图绘制它。在我使用完它后,它仍然连接到我的电脑并发送数据。所以,我需要做的是“重置”端口。这是,关闭打开的端口并再次打开它,并停止它发送数据,这样我就可以使用 arduino 尝试对该文件的代码进行一些修改。
所以为了完成这个,我的意思是,为了重置端口,我创建了另一个文件并编写了这段代码:
import serial
print "Opening port"
try:
serial_port = serial.Serial("com4", 9600)
print "Port is open"
except serial.SerialException:
serial.Serial("com4", 9600).close()
print "Port is closed"
serial_port = serial.Serial("com4",9600)
print "Port is open again"
print "Ready to use"
但是这段代码似乎不起作用。端口仍然连接并发送数据。所以,这意味着我不能用我的代码关闭端口,然后再重新打开它。
我究竟做错了什么?我怎样才能阻止arduino发送数据?或者我怎样才能重置 arduino,也许?
希望您能够帮助我。
- - - 编辑 - - -
我完成了确定我遇到的真正问题,这不是我想的。问题不在于尽管我使用了 close
Pyserial 具有的功能,但端口仍处于打开状态。真实的情况是端口正在按我的意愿关闭,但设备(arduino)仍在发送数据。所以,我更改了代码以重现这种情况。
这是代码:
print "Abriendo puerto"
ser = serial
try:
ser = serial.Serial("com4", 9600, timeout = 1)
serial_port = "Open"
print "The port %s is available" %ser
except serial.serialutil.SerialException:
print "The port is at use"
ser.close()
ser.open()
while ser.read():
print "Sending data"
ser.setBreak(True)
time.sleep(0.2)
ser.sendBreak(duration = 0.02)
time.sleep(0.2)
ser.close()
time.sleep(0.2)
print "The port is closed"
exit()
使用此代码,我所做的是:
1)我打开串口
2)如果设备正在发送数据,我打印“发送数据”
- 1 秒后,我尝试关闭端口并停止设备发送数据
我用 close
函数尝试了最后两件事来关闭端口,并阅读了我尝试使用 setBreak
和 sendBreak
-d6 的文档,你可以在 code42e 中看到上面(我故意留下的)。但设备仍在发送数据,这意味着代码不起作用。
那么,有没有办法告诉 arduino“停止发送数据”,或者我可以重置设备吗?
原文由 Pablo Flores 发布,翻译遵循 CC BY-SA 4.0 许可协议
我做了一件非常相似的事情,两种方式都成功了。
第一种方式是让Arduino不断发送数据。这里的问题是当你的 python 代码被唤醒并开始从串行端口读取时,Arduino 可能在它的程序中的任何地方。简单的解决方案是修改 Arduino 代码以发送某种“重新启动”行。在这种情况下,您所有的 Python 代码需要做的就是等待“重启”,然后读取真实数据,直到它再次看到“重启”。我有嘈杂的线路,所以我的代码通过多个周期读取(和解析)以确保它获得良好的数据。
第二种方式是使用 Arduino 实现命令-响应协议,其中 Arduino 仅在请求时发送数据。在这种情况下,您的 Python 代码向 Arduino(下例中的“RT”)发送命令,然后从 Arduino 读取数据,直到它看到“完成”行或超时。