# -*- coding: utf-8 -*-
|
__author__ = 'wangzhibo 2022.01.20'
|
|
import serial
|
import serial.tools.list_ports
|
|
|
class DustCleaner():
|
# 初始化
|
def __init__(self, com, bps, timeout):
|
self.port = com
|
self.bps = bps
|
self.timeout = timeout
|
self.com_port = None
|
self.Open()
|
|
# 打印设备基本信息
|
def Print_Name(self):
|
print(self.com_port.name) # 设备名字
|
print(self.com_port.port) # 读或者写端口
|
print(self.com_port.baudrate) # 波特率
|
print(self.com_port.bytesize) # 字节大小
|
print(self.com_port.parity) # 校验位
|
print(self.com_port.stopbits) # 停止位
|
print(self.com_port.timeout) # 读超时设置
|
print(self.com_port.writeTimeout) # 写超时
|
print(self.com_port.xonxoff) # 软件流控
|
print(self.com_port.rtscts) # 软件流控
|
print(self.com_port.dsrdtr) # 硬件流控
|
print(self.com_port.interCharTimeout) # 字符间隔超时
|
|
# 打开串口
|
def Open(self) -> bool:
|
try:
|
# 打开串口,并得到串口对象
|
self.com_port = serial.Serial(self.port, self.bps, timeout=self.timeout)
|
# 判断是否打开成功
|
if (self.com_port.is_open):
|
return True
|
else:
|
return False
|
except Exception as _:
|
return False
|
|
# 关闭串口
|
def Close(self) -> None:
|
self.com_port.close()
|
print(self.com_port.is_open) # 检验串口是否打开
|
|
# 打印可用串口列表
|
@classmethod
|
def Print_Used_Com():
|
port_list = list(serial.tools.list_ports.comports())
|
print(port_list)
|
|
# 发数据
|
def Send(self, data):
|
if (not self.com_port is None) and self.com_port.is_open():
|
self.com_port.write(data)
|
self.Recive()
|
|
def SendNoChecksum(self, data):
|
checksum = 0
|
array = bytearray(data)
|
for i in array[:-1]:
|
checksum += i
|
checksum = checksum % 256
|
array[-1] = checksum
|
self.Send(bytes(array))
|
|
def Send_onetime_clean_self(self): # 发送函数
|
self.Send(bytes([0x5A, 0x04, 0x70, 0xCE])) # 用write函数向串口发送数据
|
|
def Send_onetime_clean_camera(self): # 发送函数
|
self.Send(bytes([0x5A, 0x04, 0x71, 0xCF])) # 用write函数向串口发送数据
|
|
def Send_close_period_clean_self(self):
|
self.Send(bytes([0x5A, 0x06, 0x74, 0x00, 0x00, 0xD4])) # close self period clean
|
|
def Send_close_period_clean_camera(self):
|
self.Send(bytes([0x5A, 0x06, 0x75, 0x00, 0x00, 0xD5])) # close self period clean
|
|
def Send_period_clean_self(self, period: int):
|
minute_H = period // 256
|
minute_L = period % 256
|
self.SendNoChecksum(bytes([0x5A, 0x06, 0x74, minute_H, minute_L, 0x00]))
|
|
def Send_period_clean_camera(self, period: int):
|
minute_H = period // 256
|
minute_L = period % 256
|
self.SendNoChecksum(bytes([0x5A, 0x06, 0x75, minute_H, minute_L, 0x00]))
|
|
def Send_self_clean_params(self, start_angle: int, end_angle: int, num: int):
|
self.SendNoChecksum(bytes([0x5A, 0x07, 0x72, start_angle, end_angle, num, 0x00]))
|
|
def Send_camera_clean_params(self, start_angle: int, end_angle: int, num: int):
|
self.SendNoChecksum(bytes([0x5A, 0x07, 0x73, start_angle, end_angle, num, 0x00]))
|
|
def Recive(self):
|
return self.main_engine.read_all()
|
|
|
if __name__ == '__main__':
|
# DustCleaner.Print_Used_Com()
|
cleaner = DustCleaner("com11", 115200, 1)
|
if cleaner.Open():
|
cleaner.Send_close_period_clean_camera()
|
cleaner.Recive()
|