Asm*_*Maz 7 python arduino pyserial
我通过USB端口连接我的Arduino并使用PySerial模块向其发送数据.首先,我可以使用以下代码检查设备是否已连接:
try:
ser = serial.Serial("COM3", 9600)
except serial.serialutil.SerialException:
print "Arduino not connected"
Run Code Online (Sandbox Code Playgroud)
现在我要做的是定期检查Arduino是否仍然连接到计算机.我试过ser.isOpen()但即使Arduino断开连接也会返回true.我还想知道如何重新连接设备.我的意思是一旦断开设备,程序就无法再向Arduino发送任何数据.
大多数答案提出了两种方法:
- 在代码的某个点,通过串行发送某种消息以检查您的设备是否还活着
- 启动一个单独的线程并通过打开通信不断检查设备是否处于活动状态
第一个解决方案的问题是您并不总是检查连接,而只是检查某些特定点:这个解决方案不是很优雅,如果写得不好甚至可能无法正常工作。
第二种解决方案解决了第一种解决方案的问题,但引入了一个新问题:检查连接,或者最坏的发送消息,在线程循环中会导致问题甚至可能会中断其他功能与设备的连接。
允许您在不独占通信的情况下不断检查连接的解决方案涉及读取现有 COM:
import serial.tools.list_ports
myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]
print myports
Run Code Online (Sandbox Code Playgroud)
输出:
[(u'COM3', u'Arduino Due Programming Port (COM3)', u'some more data...'),
(u'COM6', u'USB Serial Port (COM6)', u'some more data...'),
(u'COM100', u'com0com - serial port emulator (COM100)', u'some more data...')]
Run Code Online (Sandbox Code Playgroud)
然后我们保存包含我们端口的元组:
arduino_port = [port for port in myports if 'COM3' in port ][0]
Run Code Online (Sandbox Code Playgroud)
然后我们创建一个函数来检查这个端口是否仍然存在:
import time
def check_presence(correct_port, interval=0.1):
while True:
myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]
if arduino_port not in myports:
print "Arduino has been disconnected!"
break
time.sleep(interval)
Run Code Online (Sandbox Code Playgroud)
最后,我们将此函数作为守护线程运行:
import threading
port_controller = threading.Thread(target=check_presence, args=(arduino_port, 0.1,))
port_controller.setDaemon(True)
port_controller.start()
Run Code Online (Sandbox Code Playgroud)
这样,您将每 0.1 秒检查一次 arduino 是否仍处于连接状态,当 arduino 断开连接或所有其他活动已结束时,线程将结束
您可以设置超时.
import serial
ser = serial
try:
ser = serial.Serial("COM3", 9600, timeout=10)
while ser.read():
print 'serial open'
print 'serial closed'
ser.close()
except serial.serialutil.SerialException:
print 'exception'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29881 次 |
| 最近记录: |