Lors de la réception de données de Serial en Python, il est nécessaire de spécifier SerialPort, mais s'il n'y a qu'un seul Serial et que le débit en bauds est également connu
from serial.tools import list_ports
import serial
ports = list_ports.comports()
ser = serial.Serial(ports[0].device,9600,timeout=0.1)
Vous pouvez ouvrir le port comme suit.
Si cela est trop violent, vous pouvez vérifier le format des données en circulation pour tous les ports disponibles et ouvrir le port si vous connaissez le débit en bauds série et le format des données entrantes. ..
Par exemple, depuis Arduino connecté à un PC régulièrement à 9600bps
test:data=***
Si vous recevez des données comme
from datetime import datetime as dt
from serial.tools import list_ports
import serial
import re
#---------------------------
def ReceiveSerial(_ser):
_dataStr = ""
if(_ser!=None):
_data = _ser.readline()
if(len(_data)>0):
try:
tmpDataStr = _data.decode('utf-8') # 'temp,24.5,hum,50.0'
except:
pass
else:
_dataStr = re.sub(r'\r|\n|','',tmpDataStr)
return _dataStr
#---------------------------
def ScanUsingSerialPortName(_reg="^", _baudrate = 115200):
devName = ""
ckSer = serial.Serial()
ckSer.baudrate = _baudrate
ckSer.timeout = 0.1
ports = list_ports.comports()
print("find " + str(len(ports))+"ports")
if len(ports) > 0:
deviceNames = []
for info in ports:
deviceNames.append(info.device) #Obtenez le nom du port
isReady = SerialPortCheck(ckSer,info.device,_reg)
if (isReady):
devName = info.device
break;
return devName
def SerialPortCheck(_serial, _portName, _reg):
ret = False
_serial.port = _portName #Spécifiez le port
try:
_serial.open()
except:
pass
else:
print("SerialPortCheck " + _serial.port )
startDt = dt.now()
while True:
#Lire une ligne
s = ReceiveSerial(_serial)
if(len(s)>0):
print(">" + s)
matchOB = re.match(_reg,s)
if matchOB:
print("match")
ret = True
break
tickTime = (dt.now() - startDt).seconds
if ((_serial.is_open==False) or (tickTime > 3)):
print("TimeOut" + s)
break
_serial.close()
return ret
#---------------------------
def SetSerial(_serial, _reg="^", _baudrate=115200):
if((_serial!=None)and(_serial.is_open)):
_serial.close()
tmpSer = None
usingPortName = ScanUsingSerialPortName(_reg,_baudrate)
if(usingPortName!=""):
tmpSer = serial.Serial()
tmpSer.baudrate = _baudrate
tmpSer.timeout = 0.1
tmpSer.port = usingPortName #Spécifiez le port
try:
tmpSer.open()
except:
tmpSer = None
else:
print("SetSerialOK")
return tmpSer
#---------------------------
ser =SetSerial(ser,"^"+"test:data=",9600)
Vous pouvez identifier le port en faisant comme.
Recommended Posts