如何检查设备是否已连接 Pyserial [英] How to check if device is connected Pyserial
问题描述
我通过 USB 端口与我的 Arduino 连接,并使用 PySerial 模块向其发送数据.首先,我可以使用此代码检查设备是否已连接:
尝试:ser = serial.Serial("COM3", 9600)除了 serial.serialutil.SerialException:打印Arduino 未连接"
现在我想做的是定期检查 Arduino 是否仍然连接到计算机.我尝试了 ser.isOpen()
但即使 Arduino 断开连接,它也会返回 true.我也想知道如何重新连接设备.我的意思是,一旦您断开设备连接,程序就无法再向 Arduino 发送任何数据.
大多数答案提出了 2 种方法:
<块引用>- 在代码的某些地方,通过串行发送某种消息以检查您的设备是否还活着
- 启动一个单独的线程并通过打开通信不断检查设备是否处于活动状态
第一个解决方案的问题是您不总是检查连接,而只检查某些特定点:这个解决方案不是很优雅,如果写得不好甚至可能无法工作.
第二种解决方案解决了第一种解决方案的问题,但引入了一个新问题:检查连接,或者最坏的发送消息,在线程循环中会导致问题甚至可能会中断其他功能与设备的连接.
允许您在不独占通信的情况下不断检查连接的解决方案涉及读取现有 COM:
import serial.tools.list_portsmyports = [tuple(p) for p in list(serial.tools.list_ports.comports())]打印我的端口
输出:
[(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 - 串口仿真器 (COM100)', 你还有一些数据...')]
然后我们保存包含我们的端口的元组:
arduino_port = [port for port for myports if 'COM3' in port ][0]
然后我们创建一个函数来检查这个端口是否仍然存在:
导入时间def check_presence(correct_port, interval=0.1):而真:myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]如果 arduino_port 不在 myports 中:打印Arduino 已断开连接!"休息时间.睡眠(间隔)
最后,我们将此函数作为守护线程运行:
导入线程port_controller = threading.Thread(target=check_presence, args=(arduino_port, 0.1,))port_controller.setDaemon(真)port_controller.start()
这样,你会每0.1秒检查一次arduino是否仍然连接,当arduino断开或所有其他活动都结束时线程将结束
I am connecting with my Arduino through a USB port and sending data to it by using PySerial module. At first I can check if the device is connected by using this code:
try:
ser = serial.Serial("COM3", 9600)
except serial.serialutil.SerialException:
print "Arduino not connected"
Now what I want to do is to check periodically if the Arduino is still connected to the computer. I tried ser.isOpen()
but this returns true even if the Arduino is disconnected. I would also like to know how to reconnect the device. I mean once you disconnect the device the program can no longer send any data to Arduino.
Most of the answers propose 2 approaches:
- In some point of the code, send some sort of message through serial to check if your device is still alive
- Start a separate thread and continuously check if the device is alive by opening a communication
The problem with the first solution is that you are not always checking the connection, but only checking in some specific points: this solution isn't very elegant and if badly written could even be not working.
The second solution solves the problem of the first solution, but introduces a new problem: checking the connection, or worst sending a message, in a threaded loop will cause problem or may even interrupt the connection to the device from other functions.
A solution that allows you to constantly check the connection without monopolizing the communication involves the reading of the existing COM:
import serial.tools.list_ports
myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]
print myports
output:
[(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...')]
then we save the tuple that contains our port:
arduino_port = [port for port in myports if 'COM3' in port ][0]
then we create a function that checks if this port is still present:
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)
At last, we run this function as a daemon thread:
import threading
port_controller = threading.Thread(target=check_presence, args=(arduino_port, 0.1,))
port_controller.setDaemon(True)
port_controller.start()
in this way, you'll check each 0.1 secs if the arduino is still connected, and the thread will end when arduino is disconnected or all other activities have ended
这篇关于如何检查设备是否已连接 Pyserial的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!