前言
开发起因
串口调试工具,在串口断开后需要重新选择进行连接,这个过程会耗费一定的时间,而我们的模块上电就开始打印各种日志,导致部分日志丢失。所以就有了这个程序
功能介绍
基于python3实现监听指定端口,获取串口打印数据存入log.txt文件,并自动重连。
开发环境
操作系统:win10
语言:python3.8.15
编辑器:VS Code
依赖库:pyserial (pip install pyserial)
项目地址
目录结构
- config.json (配置文件)
- log.txt (日志文件)
- main.exe (编译打包好的程序)
- main.py (程序源码)
- package.json (程序打包的相关配置 auto-py-to-exe)
使用
1.配置
自行修改为合适的配置即可。
{
// 连接的串口名
"serial_port": "COM17",
// 波特率
"serial_baudrate": 115200,
// 断开连接后的重连间隔(s),太短电脑可能会蓝屏,注意!
"interval_time": 1
}
2.运行
双击main.exe
即可。
或搭建环境,运行 python main.py
。
源码
config.json
{
"serial_port": "COM17",
"serial_baudrate": 115200,
"interval_time": 1
}
main.py (外置配置版)
# 开发起因:串口调试工具,在串口断开后需要重新选择进行连接,这个过程会耗费一定的时间,而我们的模块上电就开始打印各种日志,导致部分日志丢失。所以就有了这个程序
# 开发环境 py3.8
# 依赖库 pyserial
import serial as pyserial
import time
from datetime import datetime
import sys
import json
# 连接的串口名
serial_port = 'COM17'
# 波特率
serial_baudrate = 115200
# 断开连接后的重连间隔(s),太短电脑可能会蓝屏,注意!
interval_time = 1
# 打开本地文件
with open('config.json', 'r', encoding='utf-8') as f:
# 通过load方法将文件内容读入到字典中
data = json.load(f)
try:
serial_port = data['serial_port']
serial_baudrate = data['serial_baudrate']
interval_time = data['interval_time']
print("[当前配置]\n串口名:{}\n波特率:{}\n重连间隔(s):{}".format(serial_port, serial_baudrate, interval_time))
f.close()
except Exception as e:
print(e)
print("解析config.json出错,请检查配置是否正确")
sys.exit()
def get_current_date_string(format="%Y-%m-%d"):
"""返回当前日期的字符串表示形式,格式为 YYYY-MM-DD"""
return datetime.today().strftime(format)
while True:
try:
ser = pyserial.Serial(serial_port, serial_baudrate)
if ser.isOpen():
print("串口已连接")
break
except pyserial.SerialException:
print("串口连接失败,请检查串口是否正确连接")
time.sleep(interval_time)
while True:
try:
# 忽略无法解码的字节
data = ser.readline().decode('utf-8', 'ignore')
print(data)
file_path = "log-" + get_current_date_string() + ".txt"
# 日志写入本地
with open(file_path, 'a') as f:
f.write(data)
f.close()
except pyserial.SerialException:
print("串口断开,正在尝试重新连接", end="")
while True:
try:
ser = pyserial.Serial(SERIAL_PORT, SERIAL_BAUDRATE)
if ser.isOpen():
print("\n串口已重新连接")
break
except pyserial.SerialException:
print(".", end="", flush=True)
time.sleep(interval_time)
com_loop_link.py (写死版)
# 开发起因:串口调试工具,在串口断开后需要重新选择进行连接,这个过程会耗费一定的时间,而我们的模块上电就开始打印各种日志,导致部分日志丢失。所以就有了这个程序
# 开发环境 py3.8
# 依赖库 pyserial
import serial as pyserial
import time
# 连接的串口名
SERIAL_PORT = 'COM17'
# 波特率
SERIAL_BAUDRATE = 115200
# 断开连接后的重连间隔,太短电脑可能会蓝屏,注意!
sleep_time = 1
while True:
try:
ser = pyserial.Serial(SERIAL_PORT, SERIAL_BAUDRATE)
if ser.isOpen():
print("串口已连接")
break
except pyserial.SerialException:
print("串口连接失败,请检查串口是否正确连接")
time.sleep(sleep_time)
while True:
try:
# 忽略无法解码的字节
data = ser.readline().decode('utf-8', 'ignore')
print(data)
# 日志写入本地
with open('log.txt', 'a') as f:
f.write(data)
except pyserial.SerialException:
print("串口断开,正在尝试重新连接", end="")
while True:
try:
ser = pyserial.Serial(SERIAL_PORT, SERIAL_BAUDRATE)
if ser.isOpen():
print("\n串口已重新连接")
break
except pyserial.SerialException:
print(".", end="", flush=True)
time.sleep(sleep_time)