USBポートを介してArduinoに接続し、PySerialモジュールを使用してデータを送信しています。最初に、次のコードを使用して、デバイスが接続されているかどうかを確認できます。
_try:
ser = serial.Serial("COM3", 9600)
except serial.serialutil.SerialException:
print "Arduino not connected"
_
今私がしたいのは、Arduinoがまだコンピューターに接続されているかどうかを定期的にチェックすることです。 ser.isOpen()
を試しましたが、Arduinoが切断されていてもtrueを返します。また、デバイスを再接続する方法も知りたいです。つまり、デバイスを切断すると、プログラムは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'
ほとんどの回答は2つのアプローチを提案しています。
- コードのある時点で、シリアルを介して何らかのメッセージを送信し、デバイスがまだ生きているかどうかを確認します
- 別のスレッドを開始し、通信を開いてデバイスが動作しているかどうかを継続的に確認します
最初の解決策の問題は、not常に接続をチェックしているが、特定のポイントのみをチェックしていることです。このソリューションはあまりエレガントではなく、ひどく書かれていると機能しない可能性さえあります。
2番目の解決策は最初の解決策の問題を解決しますが、新しい問題を引き起こします。スレッドループで接続をチェックするか、最悪の場合メッセージを送信すると、問題が発生したり、他の機能からデバイスへの接続が中断されたりする場合があります。
通信を独占せずに接続を常にチェックできるソリューションには、既存のCOMの読み取りが含まれます。
import serial.tools.list_ports
myports = [Tuple(p) for p in list(serial.tools.list_ports.comports())]
print myports
出力:
[(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...')]
次に、ポートを含むタプルを保存します。
arduino_port = [port for port in myports if 'COM3' in port ][0]
次に、このポートがまだ存在するかどうかをチェックする関数を作成します。
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)
最後に、この関数をデーモンスレッドとして実行します。
import threading
port_controller = threading.Thread(target=check_presence, args=(arduino_port, 0.1,))
port_controller.setDaemon(True)
port_controller.start()
このようにして、arduinoがまだ接続されているかどうかを0.1秒ごとに確認し、arduinoが切断されるか、他のすべてのアクティビティが終了すると、スレッドが終了します。
残念ながら、これを行うために私が見つけることができる最善の方法は、いくつかの通信を試して、それが失敗するかどうかを確認することです。かなり安全な方法は次のとおりです。
try:
ser.inWaiting()
except:
print "Lost connection!"
接続が失われた後でも、ser.close()を使用して接続を閉じることをお勧めしますが、「try:except」ブロックにも配置する必要がある場合があります。
たとえば、ttyUSB0を検出するには:
import os
x=os.system("ls /dev/ttyUSB0")
if x==0:
print "connected"
else:
print "disconnected"
import serial
import time
ser = serial.Serial()
ser.braudrate = 115200
ser.port = "/dev/ttyUSB0"
ser.open()
print(ser.name)
if ser.isOpen():
print("serial is open!")
ser.close()
pythonスレッドクラスを使用してシリアル接続を実証することをお勧めします。実行方法でwhileループを配置し、最後にkilliyに使用する変数を設定します。2番目のパブリック変数はmainメソッドでデータを受信およびロードする場合はデータの保存に使用します。すぐに例を貼り付けます
class Arduino():
def __init__(self,Port='/dev/ttyUSB0',Boud=9600,connState=0):
self.parent=self
self.port=Port
self.boud=Boud
self.connState=connState
self.timeount=1
self.ser=None
self.connect()
def connect(self):
try:
self.ser=serial.Serial(self.port,self.boud,timeout=0.0001)
self.connState=1
return [1,'connect']
except:
self.connState=0
return [0,'no hardware found']
def loadData(self):
self.buffer=self.ser.read(1)
if (self.buffer!=''):
try:
print self.buffer
except Exception, e:
pass
ard=Arduino()
while True:
if ard.connState:
ard.loadData()
else:
print "Arduino not found"
break
そしてから始める:
import threading
class ThController( threading.Thread ):
# Override Thread's __init__ method to accept the parameters needed:
def __init__( self,parent):
self.parent = parent
threading.Thread.__init__ ( self )
def run ( self ):
while self.parent.ctrlattive:
j=json.loads(data)
self.parent.data=j