PySerial(Python的串口通信)
介绍
略
安装
conda search pyserial
Loading channels: done
# Name Version Build Channel
pyserial 3.4 py27_0 pkgs/main
...
pyserial 3.5 py39haa95532_0 pkgs/main
conda install pyserial
入门
初始化
serial.Serial(SerialBase)
serial.Serial(
port=test_port, #端口号
baudrate=test_baudrate, #波特率
bytesize=serial.EIGHTBITS, #数据位
parity=serial.PARITY_NONE, #奇偶校验位
stopbits=serial.STOPBITS_ONE, #停止位
timeout=None, #超时时间
)
打开串口
serial.Serial.open(self)
关闭串口
serial.Serial.close(self)
读取串口数据
serial.Serial.read(self, size=1): #从端口读字节数据,默认1个字节
serial.Serial.read_all(self) #从端口接收全部数据
serial.Serial.readline(self, __size: int | None = -1) #读一行数据
serial.Serial.readlines(self, __hint: int = -1) #读多行数据
写入串口数据
serial.Serial.write(self, data)
清除串口缓冲数据
self.serial.flushInput() # 清除接收缓冲区数据
self.serial.flushOutput() # 中止当前输出并清除发送缓冲区数据
串口自动化发送demo
class Solution(object):
def __init__(self, yw_serial=None) -> None:
self.serial = yw_serial
self.complete_str = None
self.timeout = 8
def open_serial(self):
if self.serial is None:
return -1
if not self.serial.isOpen:
self.serial.open()
def close_serial(self):
self.serial.close()
# 读取串口数据
def read_serial(self, complete_str='\r\nOK\r\n') -> str:
start_time = time.time()
end_time = time.time()
self.complete_str = complete_str
all_data = bytearray()
is_completed = False
while True:
end_time = time.time()
if end_time - start_time < self.timeout:
if self.serial.inWaiting() > 0:
data = self.serial.read(self.serial.inWaiting())
all_data = all_data + data
if is_completed:
break
if self.complete_str is not None:
if re.search(bytes(self.complete_str, encoding="utf8"), all_data) is not None:
break
else:
break
time.sleep(0.01)
all_data = str(all_data, encoding="utf-8")
return all_data
# 串口写入数据
def wirte_serial(self, data):
self.serial.flushInput() # 清除接收缓冲区数据
self.serial.flushOutput() # 中止当前输出并清除发送缓冲区数据
self.serial.write(str(data).encode('utf-8'))
def run(self, cmd):
self.wirte_serial(cmd)
while True:
response = self.read_serial()
if response is not None:
break
return response
try:
ser = serial.Serial(
port=test_port,
baudrate=test_baudrate,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=None,
)
except serial.SerialTimeoutException:
print('打开%s串口超时' % test_port)
exit(0)
except serial.SerialException:
print('串口%s不存在或被占用' % test_port)
exit(0)
else:
print('打开串口%s成功' % test_port)
sdper = Solution(ser)
sdper.open_serial()
for i in range():
response = sdper.run(str(at_cmd) + '\r\n', timeout)
print(response)
sdper.close_serial()