一、开发前置核心准备
在编写主站代码前,必须完成这 3 项准备工作,这是通信成功和程序正常运行的基础。
1. 核心 Python 库选择(工业主流,轻量易实现)
放弃手写 Modbus-RTU 帧和串口通信(易出错、维护成本高),直接使用工业界成熟的封装库,两个核心库即可满足所有需求,均支持 Python3.7+,安装简单:
本文详细介绍了基于 Python 和 Modbus-RTU 协议构建仓库温度监控系统的完整方案。内容包括开发环境准备、硬件参数配置、软件架构设计、核心代码实现(含重试机制、防抖动控制、日志记录)、运行调试步骤及系统扩展优化。重点解决了工业场景下的通信稳定性、异常处理及安全策略问题,支持 Windows、Linux 及树莓派跨平台部署。

在编写主站代码前,必须完成这 3 项准备工作,这是通信成功和程序正常运行的基础。
放弃手写 Modbus-RTU 帧和串口通信(易出错、维护成本高),直接使用工业界成熟的封装库,两个核心库即可满足所有需求,均支持 Python3.7+,安装简单:
| 库名 | 作用 | 安装命令 | 核心优势 |
|---|---|---|---|
pyserial | 底层串口通信驱动(USB-485 转换器的串口操作) | pip install pyserial | 跨平台(Windows/Linux/树莓派),封装所有串口操作 API |
minimalmodbus | 基于 pyserial 的 Modbus-RTU 轻量封装 | pip install minimalmodbus | 仅聚焦 Modbus-RTU(串行总线),封装功能码、寄存器操作、帧校验,一行代码实现读/写,新手友好 |
替代方案:
pymodbus(功能更全,支持 Modbus-TCP/RTU),但配置稍复杂;仓库 485 串行场景下,minimalmodbus足够用且更轻量化,优先选择。
所有 485 总线上的设备(温度模块、IO 模块)和 Python 主站的串口 / Modbus 参数必须完全一致,同时需从设备手册中确认从站地址、寄存器地址、数据解析规则(核心,不同品牌模块仅这 3 项不同,代码无需改动)。
# 串口参数(USB-485转换器)
BAUDRATE = 9600 # 波特率,工业默认9600
BYTESIZE = 8 # 数据位8
PARITY = 'N' # 校验位无(None),可选'E'偶校验/'O'奇校验
STOPBITS = 1 # 停止位1
TIMEOUT = 1 # 串口超时时间,单位秒(主站等待从站响应的时间)
# Modbus-RTU通用参数
SLAVE_ADDR_TEMP = 1 # 温度采集模块从站地址(拨码设置,1-247唯一)
SLAVE_ADDR_IO = 2 # IO继电器模块从站地址(拨码设置,与温度模块不同)
| 设备类型 | 核心参数(示例) | 说明 |
|---|---|---|
| 温度采集模块 | ① 温度寄存器起始地址:0x0000(十进制 0)② 通道数:8 路(寄存器 0-7 对应通道 1-8)③ 数据解析:10 倍整数(寄存器值 256 → 实际 25.6℃) | 温度值存于输入寄存器(只读),功能码 03 读取 |
| IO 继电器模块 | ① 继电器线圈寄存器起始地址:0x0000(十进制 0)② 控制通道:1 路(对应加热设备,寄存器 0)③ 线圈值规则:1=吸合(启动加热)/0=断开(停止加热) | 继电器状态存于线圈寄存器(可写),功能码 05 写入单个线圈 |
关键规则:Modbus 寄存器地址有十进制 / 十六进制两种表示,代码中统一用十进制;温度模块几乎都用10 倍 / 100 倍整数存储温度(避免浮点传输,提升工业通信稳定性)。
遵循工业级模块化设计思想,将软件拆分为6 个核心模块,模块间低耦合、高内聚,后续扩展(如增加测点、制冷控制、远程报警)仅需修改配置或新增小模块,核心代码无需改动。同时采用Modbus 主从式请求 - 响应架构+闭环控制逻辑,贴合仓库监控的无人值守需求。
参数配置模块(集中管理所有硬件/业务参数)
↓
串口与 Modbus 初始化模块(创建主站对象,打开串口,异常捕获)
↓
主循环模块(定时轮询,串联所有模块,优雅启停)
├→ 温度采集模块(读取多通道温度,数据校验 + 通信重试)
├→ 核心控制逻辑模块(超温判断 + 防抖动 + 加热启停决策)
├→ IO 控制模块(下发 Modbus 指令,控制继电器,幂等写入)
└→ 日志记录模块(记录温度、IO 状态、异常,控制台 + 文件)
仓库温度监控以防低温为主(如冷链仓库除外),核心闭环逻辑为:
自定义温度上下限(如下限 5℃,上限 25℃)→ 轮询读取所有测点温度 → 若任意测点连续 N 次低于下限(防抖动),则下发指令启动加热 → 若所有测点连续 N 次恢复至上下限之间,则下发指令停止加热 → 循环轮询
核心防抖动设计:避免仓库温度微小波动(如传感器误差、环境气流)导致加热设备频繁启停,减少硬件损耗和电力浪费,这是仓库场景必备特性。
所有代码跨平台(Windows10/11、Linux、树莓派 Raspbian),仅需在参数配置模块根据你的设备手册和仓库业务需求修改参数,其余代码无需改动。代码中包含详细注释+工业级异常处理(串口打开失败、Modbus 通信超时、设备掉线、数据无效等)+通信重试机制+防抖动控制+日志记录,可直接复制运行。
# 导入核心库
import time
import logging
from datetime import datetime
import minimalmodbus
# ===================== 1. 参数配置模块(核心!仅需修改此模块,适配你的硬件/业务)=====================
# ---------------------- 1.1 串口/Modbus 硬件参数(对照设备手册 + 拨码设置)----------------------
# USB-485 转换器的串口端口(关键!Windows 为 COMx,Linux/树莓派为/dev/ttyUSBx)
# Windows 示例:PORT = "COM3" | Linux/树莓派示例:PORT = "/dev/ttyUSB0"
PORT = "COM3"
# 串口基础参数(所有 485 设备必须与之一致)
BAUDRATE = 9600
BYTESIZE = 8
PARITY = minimalmodbus.PARITY_NONE # minimalmodbus 专用枚举,NONE/EVEN/ODD
STOPBITS = 1
TIMEOUT = 1 # 串口超时时间(秒)
# Modbus 从站地址(拨码设置,唯一)
SLAVE_ADDR_TEMP = 1 # 温度采集模块地址
SLAVE_ADDR_IO = 2 # IO 继电器模块地址
# 温度模块寄存器参数(对照设备手册)
TEMP_REG_START = 0 # 温度寄存器起始地址(十进制)
TEMP_CHANNEL_NUM = 3 # 仓库实际布点的温度测点数(如 3 个测点,读取寄存器 0/1/2)
TEMP_MULTIPLE = 10 # 温度值放大倍数(寄存器值/TEMP_MULTIPLE=实际温度,如 10 倍)
# IO 模块寄存器参数(对照设备手册)
IO_REG = 0 # 控制加热设备的继电器线圈寄存器地址(十进制)
IO_ON = 1 # 继电器吸合(启动加热)
IO_OFF = 0 # 继电器断开(停止加热)
# ---------------------- 1.2 仓库业务参数(按需求自定义)----------------------
TARGET_TEMP_LOW = 5.0 # 温度下限(低于此值启动加热),单位℃
TARGET_TEMP_HIGH = 25.0 # 温度上限(高于此值无需加热),单位℃
POLL_INTERVAL = 5 # 轮询间隔(秒),仓库场景 5-10 秒即可
ANTI_SHAKE_COUNT = 2 # 防抖动连续判定次数(连续 2 次超温才动作,避免波动)
RETRY_TIMES = 2 # Modbus 操作重试次数(单次通信失败后重试,提升稳定性)
# ===================== 2. 日志记录模块(工业级,控制台 + 文件,方便追溯/排查)=====================
def init_logger():
""" 初始化日志配置:
- 同时输出到控制台和日志文件
- 日志包含时间、级别、内容,文件按时间命名,编码 UTF-8
- 日志级别:INFO(常规信息)、ERROR(错误)、WARNING(警告)
"""
log_filename = f"warehouse_temp_monitor_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"
# 日志格式
log_format = "%(asctime)s - %(levelname)s - %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
# 配置日志
logging.basicConfig(
level=logging.INFO,
format=log_format,
datefmt=date_format,
handlers=[
logging.FileHandler(log_filename, encoding="utf-8"), # 写入文件
logging.StreamHandler() # 输出到控制台
]
)
return logging.getLogger(__name__)
# 初始化日志对象,全局使用
logger = init_logger()
# ===================== 3. 串口与 Modbus 主站初始化模块(创建设备对象,打开串口)=====================
def init_modbus_master():
""" 初始化 Modbus-RTU 主站对象,分别创建温度模块和 IO 模块的操作对象
:return: temp_instr(温度模块对象)、io_instr(IO 模块对象),失败则返回 None
"""
try:
# 创建 Modbus 主站对象,指定串口端口
temp_instr = minimalmodbus.Instrument(PORT, SLAVE_ADDR_TEMP)
io_instr = minimalmodbus.Instrument(PORT, SLAVE_ADDR_IO)
# 统一配置两个对象的串口参数(所有 485 设备一致)
for instr in [temp_instr, io_instr]:
instr.serial.baudrate = BAUDRATE
instr.serial.bytesize = BYTESIZE
instr.serial.parity = PARITY
instr.serial.stopbits = STOPBITS
instr.serial.timeout = TIMEOUT
instr.mode = minimalmodbus.MODE_RTU # 强制 RTU 模式(串行 485)
instr.clear_buffers_before_transaction = True # 发送前清空串口缓冲区,避免脏数据
logger.info("Modbus 主站初始化成功,串口参数与 485 设备一致")
return temp_instr, io_instr
except Exception as e:
logger.error(f"Modbus 主站初始化失败!原因:{str(e)}", exc_info=True)
return None, None
# ===================== 4. 工具函数模块(通用功能,解耦核心代码)=====================
def retry_operation(operation, *args, retry_times=RETRY_TIMES):
""" Modbus 操作重试装饰器(通用):单次操作失败后重试 N 次,提升通信稳定性
:param operation: 要执行的 Modbus 操作函数(读温度/写 IO)
:param args: 操作函数的参数
:param retry_times: 重试次数
:return: 操作成功返回结果,失败返回 None
"""
for i in range(retry_times + 1):
try:
result = operation(*args)
return result
except Exception as e:
if i < retry_times:
logger.warning(f"Modbus 操作第{i+1}次失败,正在重试!原因:{str(e)}")
time.sleep(0.5) # 重试前延时 0.5 秒,避免总线拥堵
else:
logger.error(f"Modbus 操作重试{retry_times}次后仍失败!原因:{str(e)}")
return None
# ===================== 5. 温度采集模块(读取多通道温度,数据校验,重试机制)=====================
def read_temperature(temp_instr):
""" 读取温度模块的多通道温度数据,含数据有效性校验
:param temp_instr: 温度模块的 Modbus 主站对象
:return: 有效温度列表(如 [6.2, 5.8, 7.1]),失败返回空列表
"""
def _read():
"""内部实际读取函数(供重试装饰器调用)"""
# 功能码 03:读取输入寄存器,参数:起始地址、读取数量、功能码
# 返回复数列表,每个元素为对应寄存器的整数值
reg_values = temp_instr.read_registers(
registeraddress=TEMP_REG_START,
number_of_registers=TEMP_CHANNEL_NUM,
functioncode=3
)
# 解析实际温度:寄存器值/放大倍数,保留 1 位小数
temp_list = [round(val / TEMP_MULTIPLE, 1) for val in reg_values]
# 数据有效性校验:过滤超量程的无效温度(如模块故障返回的极大/极小值)
valid_temp_list = [t for t in temp_list if -40.0 <= t <= 85.0]
# DS18B20 量程 -40~85℃
if len(valid_temp_list) != len(temp_list):
logger.warning(f"检测到无效温度数据,已过滤!原始数据:{temp_list},有效数据:{valid_temp_list}")
return valid_temp_list
# 调用重试装饰器,执行读取操作
valid_temps = retry_operation(_read)
return valid_temps if valid_temps is not None else []
# ===================== 6. IO 控制模块(写入 Modbus 线圈,控制继电器,幂等写入)=====================
def control_io(io_instr, target_state):
""" 控制 IO 继电器模块,启停加热设备,含幂等写入(避免重复写入相同状态)
:param io_instr: IO 模块的 Modbus 主站对象
:param target_state: 目标状态(IO_ON=1/IO_OFF=0)
:return: 操作成功返回 True,失败返回 False
"""
def _write():
"""内部实际写入函数(供重试装饰器调用)"""
# 先读取当前线圈状态,实现幂等写入(仅状态不同时才写入,减少模块损耗)
current_state = io_instr.read_bit(IO_REG, functioncode=01) # 功能码 01:读取线圈状态
if current_state == target_state:
logger.info(f"IO 模块当前状态与目标状态一致({current_state}),无需重复写入")
return True
# 功能码 05:写入单个线圈,参数:线圈地址、目标状态、功能码
io_instr.write_bit(IO_REG, target_state, functioncode=5)
logger.info(f"IO 模块写入成功!目标状态:{target_state}({IO_ON:'启动加热' if target_state==IO_ON else '停止加热'})")
return True
# 调用重试装饰器,执行写入操作
result = retry_operation(_write)
return result if result is not None else False
# ===================== 7. 核心控制逻辑模块(超温判断 + 防抖动 + 加热启停决策)=====================
class TempControlLogic:
""" 温度控制逻辑类:封装防抖动计数,实现连续超温判定
面向对象设计,方便维护防抖动状态(主循环中持续实例化,保留计数)
"""
def __init__(self):
self.under_low_count = 0 # 低于下限的连续计数
self.normal_count = 0 # 恢复正常的连续计数
def judge_heating_state(self, temp_list):
""" 根据温度列表判断加热设备的目标状态
:param temp_list: 有效温度列表
:return: 目标 IO 状态(IO_ON/IO_OFF),判定说明
"""
# 无有效温度数据,返回停止加热(安全策略)
if not temp_list:
self.under_low_count = 0
self.normal_count = 0
return IO_OFF, "无有效温度数据,执行安全策略:停止加热"
# 仓库逻辑:任意测点温度低于下限,判定为需要加热
is_under_low = any(t < TARGET_TEMP_LOW for t in temp_list)
# 所有测点温度在上下限之间,判定为正常
is_normal = all(TARGET_TEMP_LOW <= t <= TARGET_TEMP_HIGH for t in temp_list)
# 防抖动计数更新
if is_under_low:
self.under_low_count += 1
self.normal_count = 0 # 超温时重置正常计数
elif is_normal:
self.normal_count += 1
self.under_low_count = 0 # 正常时重置超温计数
else:
# 温度高于上限,无需加热,重置所有计数
self.under_low_count = 0
self.normal_count = 0
# 根据连续计数判断目标状态
if self.under_low_count >= ANTI_SHAKE_COUNT:
self.under_low_count = ANTI_SHAKE_COUNT # 防止计数溢出
return IO_ON, f"连续{ANTI_SHAKE_COUNT}次检测到任意测点低于下限({TARGET_TEMP_LOW}℃),需启动加热"
elif self.normal_count >= ANTI_SHAKE_COUNT:
self.normal_count = ANTI_SHAKE_COUNT # 防止计数溢出
return IO_OFF, f"连续{ANTI_SHAKE_COUNT}次检测到所有测点恢复正常,需停止加热"
else:
# 计数未达阈值,保持当前状态(无操作)
return None, f"防抖动计数中:低于下限{self.under_low_count}/{ANTI_SHAKE_COUNT}次,正常{self.normal_count}/{ANTI_SHAKE_COUNT}次,保持当前状态"
# ===================== 8. 主循环模块(串联所有模块,定时轮询,优雅启停)=====================
def main():
""" 主函数:系统入口,串联所有模块,实现持续轮询与控制
包含优雅启停(Ctrl+C)、全局异常处理、资源释放
"""
logger.info("===== 仓库温度监控系统(Modbus-RTU 主站)启动 =====")
logger.info(f"核心配置:串口{PORT} | 温度测点{TEMP_CHANNEL_NUM}个 | 温度阈值{TARGET_TEMP_LOW}~{TARGET_TEMP_HIGH}℃ | 轮询间隔{POLL_INTERVAL}秒 | 防抖动{ANTI_SHAKE_COUNT}次")
# 步骤 1:初始化 Modbus 主站对象
temp_instr, io_instr = init_modbus_master()
if temp_instr is None or io_instr is None:
logger.error("Modbus 主站初始化失败,系统退出!")
return
# 步骤 2:实例化温度控制逻辑类(保留防抖动计数状态)
temp_control = TempControlLogic()
# 记录当前 IO 状态(初始为停止加热)
current_io_state = IO_OFF
try:
# 无限循环:持续轮询(仓库无人值守核心)
while True:
logger.info("-" * 80) # 日志分隔线,方便查看
# 步骤 3:读取多通道温度数据
temp_list = read_temperature(temp_instr)
logger.info(f"温度采集完成 | 有效测点{len(temp_list)}个 | 各测点温度:{temp_list}℃")
# 步骤 4:核心逻辑判断,获取目标 IO 状态
target_io_state, judge_note = temp_control.judge_heating_state(temp_list)
logger.info(f"控制逻辑判定 | {judge_note}")
# 步骤 5:若有目标状态,执行 IO 控制
if target_io_state is not None:
if control_io(io_instr, target_io_state):
current_io_state = target_io_state # 更新当前 IO 状态
else:
logger.error(f"IO 控制失败,当前状态保持为:{current_io_state}")
# 步骤 6:等待轮询间隔,进入下一次循环
time.sleep(POLL_INTERVAL)
# 捕获手动停止信号(Ctrl+C),优雅退出
except KeyboardInterrupt:
logger.info("===== 检测到手动停止信号(Ctrl+C),系统开始优雅退出 =====")
# 退出前执行安全策略:停止加热设备
control_io(io_instr, IO_OFF)
logger.info("安全策略执行完成:加热设备已停止")
# 捕获全局未知异常,避免系统崩溃
except Exception as e:
logger.error(f"系统运行出现未知异常,强制退出!原因:{str(e)}", exc_info=True)
# 异常时执行安全策略:停止加热设备
control_io(io_instr, IO_OFF)
finally:
# 释放串口资源
temp_instr.serial.close()
io_instr.serial.close()
logger.info("===== 仓库温度监控系统退出完成,串口资源已释放 =====")
# 系统入口:仅直接运行脚本时执行主函数
if __name__ == "__main__":
main()
以上代码的每个模块都针对仓库工业场景做了专属优化,以下讲解核心设计的初衷和优势,帮助你理解并灵活调整:
所有硬件参数(串口、Modbus、寄存器)和业务参数(温度阈值、轮询间隔)都集中在代码开头,无需深入代码内部修改,新手也能快速适配自己的设备,符合工业软件'易配置、易维护'的要求。
放弃简单的print,使用 Python 内置的logging模块,实现控制台 + 文件双日志,日志包含时间、级别、详细内容,方便仓库系统的运行状态追溯和故障排查(如设备掉线时,可通过日志查看具体失败原因)。
retry_operation工具函数)485 总线在仓库复杂电磁环境中(如电机、货架)易出现临时通信失败,通过重试装饰器实现单次操作失败后自动重试,避免因偶然通信问题导致系统误判,提升通信稳定性。
对读取的温度值做量程过滤(基于 DS18B20 的 - 40~85℃量程),过滤模块故障或通信错误返回的极大 / 极小无效值,避免无效数据导致控制逻辑误动作。
控制继电器前,先读取当前线圈状态,仅当目标状态与当前状态不同时才执行写入操作,避免重复写入相同状态导致 IO 模块继电器频繁吸合 / 断开,减少硬件损耗。
通过TempControlLogic类封装防抖动计数,主循环中持续实例化该类,保留计数状态,实现'连续 N 次超温才动作'的防抖动逻辑,解决仓库温度微小波动导致加热设备频繁启停的问题。
系统出现无有效温度数据、未知异常、手动停止时,都会自动执行停止加热设备的安全策略,避免因系统故障导致加热设备持续运行,引发仓库温度过高的安全隐患,符合工业控制系统的'故障安全'原则。
通过try-except-finally捕获手动停止信号和全局异常,退出前停止加热设备 + 释放串口资源,避免串口被占用(下次运行无法打开)和硬件异常。
pip install pyserial minimalmodbus;PORT:
ls /dev/ttyUSB*,查看对应的串口(如 /dev/ttyUSB0),若提示权限不足,执行sudo chmod 777 /dev/ttyUSB0。python warehouse_temp_monitor.py;sudo python3 warehouse_temp_monitor.py;2025-10-22 14:30:00 - INFO - ===== 仓库温度监控系统(Modbus-RTU 主站)启动 =====
2025-10-22 14:30:00 - INFO - 核心配置:串口 COM3 | 温度测点 3 个 | 温度阈值 5.0~25.0℃ | 轮询间隔 5 秒 | 防抖动 2 次
2025-10-22 14:30:00 - INFO - Modbus 主站初始化成功,串口参数与 485 设备一致
2025-10-22 14:30:00 - INFO - --------------------------------------------------------------------------------
2025-10-22 14:30:00 - INFO - 温度采集完成 | 有效测点 3 个 | 各测点温度:[3.2, 4.8, 5.1]℃
2025-10-22 14:30:00 - INFO - 控制逻辑判定 | 防抖动计数中:低于下限 1/2 次,正常 0/2 次,保持当前状态
2025-10-22 14:30:05 - INFO - --------------------------------------------------------------------------------
2025-10-22 14:30:05 - INFO - 温度采集完成 | 有效测点 3 个 | 各测点温度:[2.9, 4.5, 4.9]℃
2025-10-22 14:30:05 - INFO - 控制逻辑判定 | 连续 2 次检测到任意测点低于下限(5.0℃),需启动加热
2025-10-22 14:30:05 - INFO - IO 模块写入成功!目标状态:1(启动加热)
| 问题现象 | 大概率原因 | 解决方法 |
|---|---|---|
| 串口打开失败,提示'Access denied' | 串口被其他程序占用(如 SSCOM)/Linux/树莓派无权限 | 关闭占用串口的程序;Linux 执行sudo chmod 777 /dev/ttyUSB0 |
| Modbus 操作重试多次失败 | 1.A/B 线接反 2. 从站地址错误 3. 串口参数不一致 4. 设备未上电 | 1.调换 A/B 线 2.核对设备拨码地址 3.统一所有设备的串口参数 4.检查设备电源 |
| 读取温度为固定值 / 无效值 | 1.寄存器地址错误 2.温度放大倍数错误 3.模块通道未接传感器 | 1.对照设备手册修正寄存器地址 2.确认放大倍数(如 10 倍/100 倍)3.检查传感器接线 |
| 写入 IO 模块无反应 | 1.线圈寄存器地址错误 2.IO 模块从站地址错误 3.继电器接线错误 | 1.对照手册修正线圈地址 2.核对 IO 模块拨码 3.检查继电器与加热设备的接线 |
基础版本已实现核心的采集 - 判断 - 控制 - 日志功能,针对仓库的进阶需求(如无人值守、远程监控、多设备控制),可做以下轻量扩展,无需改动核心代码,仅需新增模块或修改配置:
避免日志文件过大,使用logging.handlers.RotatingFileHandler实现日志轮转(如单个文件最大 100MB,保留 5 个备份),修改init_logger函数即可。
将温度数据、IO 状态上传至 MQTT 服务器(如阿里云 IoT、EMQ X),实现手机/电脑远程查看,新增mqtt_upload模块,在主循环中采集温度后调用即可(使用paho-mqtt库)。
当温度超范围时,触发报警通知:
smtplib库发送邮件,或调用短信 API(如阿里云短信)。仓库若需制冷(如冷链)或排风,仅需:
control_io_cool函数(复用control_io的逻辑)。将温度数据写入SQLite/MySQL/InfluxDB,实现历史数据查询和温度趋势分析:
sqlite3库(无需额外安装),新增db_insert模块;将 Python 程序配置为树莓派systemd 服务,实现开机自动运行,断电重启后无需手动操作,适合仓库无人值守场景。
本次 Python Modbus-RTU 主站软件是专为仓库温度监控场景设计的工业级实现,核心要点可归纳为 3 点:
这套方案不仅适用于仓库温度监控,稍作修改后还可适配车间、机房、冷链等所有基于 485 Modbus-RTU 的工业环境监控场景,是 Python 工业自动化开发的通用模板。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online