You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
6.5 KiB

import binascii
import re
import time
import serial
from time import sleep
import threading
class SerialPort(object):
def __init__(self,Name,BaudRate,timeout=0.1):
# 串口通信同步锁
self.lockSend=threading.Lock()
self.ser = None
self.encoding = '' # 编码格式
try:
self.ser = serial.Serial(Name, BaudRate, timeout=timeout,)
except Exception as e:
print('serialserialserial',str(e))
# 发送的指令'00 01 00 00 23 ...'
def send_cmd_hex(self,cmd,readCount=0):
try:
self.lockSend.acquire()
data=None
cmd = bytes.fromhex(cmd) # 将发送的
retry_times = 0 # 默认读取一次
self.ser.flushInput()
self.ser.write(cmd)
time.sleep(0.2)
while retry_times ==0:
count = self.ser.inWaiting() #获取接收缓存区的字节数
retry_times += 1
if(readCount==0):
data = self.ser.readall()
if data == None:
continue
else:
break
else:
if(readCount==1):
data = self.ser.read(count)
else:
data = self.ser.read(readCount)
if data == None:
continue
else:
break
#sleep(0.002)
# self.ser.flushInput()
#print('ggggggggggg::',data) # b'\x01\x03\x04\x00\x00\x00\x00\xfa3'
return data
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
# 发送给的指令 #~000~qst~start~@对字符串进行转换成byte类型再发送传给
def send_cmd(self,cmd,readCount=0):
try:
self.lockSend.acquire()
data=None
if self.encoding:
cmd = cmd.encode(self.encoding)
else:
cmd = cmd.encode()
retry_times = 0 # 默认读取一次
self.ser.flushInput()
self.ser.write(cmd)
time.sleep(0.2)
while retry_times ==0:
count = self.ser.inWaiting() #获取接收缓存区的字节数
retry_times += 1
if(readCount==0):
data = self.ser.readall()
if self.encoding:
data = data.decode(self.encoding)
else:
data = data.decode()
if data == None:
continue
else:
break
else:
if(readCount==1):
data = self.ser.read(count)
else:
data = self.ser.read(readCount)
if data == None:
continue
else:
break
#sleep(0.002)
# self.ser.flushInput()
print('ggggggggggg::',data)
return data.replace("\r\n", '')
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
def Read(self,readCount=0):
try:
self.lockSend.acquire()
data=None
while True:
count = self.ser.inWaiting() #获取接收缓存区的字节数
if(readCount==0):
data = self.ser.readall()
if data == None:
continue
else:
break
else:
if(readCount==1):
data = self.ser.read(count)
else:
data = self.ser.read(readCount)
if data == None:
continue
else:
break
#sleep(0.002)
# self.ser.flushInput()
return data
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
def ReadAll(self,readCount=0):
try:
self.lockSend.acquire()
data=None
while True:
#count = self.ser.inWaiting() #获取接收缓存区的字节数
if(readCount==0):
data = self.ser.readall()
if data == None:
continue
else:
break
else:
data = self.ser.read(readCount)
if data == None:
continue
else:
break
#sleep(0.002)
#self.ser.flushInput()
return data
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
def FlushInput(self): #清空缓存
try:
self.lockSend.acquire()
self.ser.flushInput()
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
def Write(self,data):
try:
self.lockSend.acquire()
self.ser.flushInput()
self.ser.write(data)
except Exception as e:
raise e
except OSError as e:
raise e
finally:
self.lockSend.release()
def Close(self):
try:
self.ser.close()
except Exception as e:
print('serialClose:',e)
if __name__ == "__main__":
# sp = SerialPort.SerialPort('/dev/ttyS0',115200)
# while True:
# #cmd=input('输入发送:')
# sp.Write('#~000~qst~lock0~@\r\n'.encode())
# #print("发送:"+cmd)
# d = sp.Read()
# print("接收:"+bytes.decode(d))
# import SerialPort
ser = SerialPort('com1', 9600)
# ser = SerialPort('/dev/ttyUSB0', 9600)
print('rrrrrrrrrrrrrrrrrrrrrrrrrrrr:::::',ser)
cmd = "01 03 12 07 00 14 F1 7C"
data = ser.send_cmd_hex(cmd)
print('ssssssssssssssssssssssssssssssssssssssss:::',data)