前言
完全没碰过编程、没装过 Python 的同学,跟着本文一步走,不用提前懂任何 C / 计算机基础,全程实操上手,看完就能写出可运行代码。
第 0 步:先确认你的电脑能跑 Python(Windows)
操作流程
- 快捷键
Win + R,输入cmd回车,打开命令终端 - 在黑框里输入校验命令:
py -3 --version- 两种结果处理:
- ✅ 正常:输出
Python 3.x.x,代表环境就绪,直接下一步 - ❌ 未安装:浏览器打开 python.org 下载安装包
安装必勾选:
Add Python to PATH,不勾选会导致终端识别不到 python 命令
第 1 步:搞懂 Python 到底是什么
Python 属于解释型语言,和 C 语言最大区别:不用提前编译,写完代码直接运行。
最简演示示例
- 桌面新建文本文档,重命名为
test.py(注意后缀是.py,不是.txt) - 文件内写入一行代码:
print("hello")- cmd 终端切换到文件所在文件夹,执行运行命令:
py -3 test.py- 终端直接输出结果:
hello第 2 步:一张表看懂 Python 和 C 语言六大核心区别
如果你之前接触过 C 语言,这张表能快速帮你转换思维;零基础同学简单浏览有印象即可,不用死记硬背。
| 概念 | C 语言写法 | Python 写法 | 直观感受 |
|---|---|---|---|
| 变量 | int a = 10;必须提前声明数据类型 | a = 10无需声明,直接赋值 | Python 代码更懒、更省事 |
| 代码块 | {}大括号包裹代码段 | 4 个空格缩进划分代码块 | 缩进错一个空格,程序直接报错 |
| 数组 | int arr[5];创建时固定长度,不能变长 | arr = [1,2,3,4,5]随时增删元素,长度自由变化 | Python 数据容器更灵活 |
| 函数 | int f(int x){ return x*2; } | def f(x): return x*2 | Python 定义函数极简 |
| 循环 | for(int i=0;i<10;i++) | for i in range(10):range(10)等价数字 0~9 | 不用手动控制自增,简洁易懂 |
| 打印输出 | printf("%d\n", a); | print(a) | 一行搞定打印,不用复杂格式化 |
第 3 步:你的第一个完整交互式 Python 程序
新建文件day5.py,复制下方全部代码,包含注释讲解:
# # 号开头是单行注释,程序运行时会自动忽略 # input() 功能:从键盘读取用户输入的文字 name = input("你叫什么名字?") # print() 功能:把内容打印输出到终端屏幕 print("你好," + name + "!")运行 & 效果
- cmd 终端执行:
py -3 day5.py- 终端提示输入名字,输入后回车,示例交互:
你叫什么名字?謓泽 你好,謓泽!第 4 步:用 pip 安装第三方功能库(拓展 Python 能力)
Python 自带基础功能有限,串口、绘图、数学计算、仪器控制都需要第三方库,安装工具pip随 Python 自带。
通用安装命令模板
py -3 -m pip install 库名工程常用库实操安装示例
# 串口通信库,对接单片机、MCU硬件 py -3 -m pip install pyserial # 仪器控制库,程控电源、示波器、网口仪器 py -3 -m pip install pyvisa # 绘图可视化库,绘制波形、数据图表 py -3 -m pip install matplotlib # 数值计算库,矩阵、信号、数学运算 py -3 -m pip install numpy库使用规则
安装完成后,代码开头用import导入库才能调用功能,import作用等价 C 语言里的#include。
# 示例:导入数值计算库 numpy import numpy结尾:入门学习路线小结
- 环境校验:
py -3 --version确认 Python 正常 - 基础语法:变量、print、input、缩进、循环
- 第三方拓展:pip 安装工具库,适配硬件、绘图、算法场景
- 实操优先:每段代码复制运行,直观看到输出效果,比死记理论更快上手!
单独章节:pyserial 串口通信(单片机 / 硬件必备)
1. 库安装命令
打开 cmd 终端执行:
py -3 -m pip install pyserial给 Python 增加串口读写能力,用来 STM32、51、Arduino 等 MCU 单片机、串口模块交互。
2. 完整可运行代码
# 导入串口库,等价C语言 #include 头文件 import serial # 1. 初始化串口对象 # 参数说明: # "COM3":设备管理器里你的串口编号,设备不同数字不一样 # 9600:波特率,必须和单片机程序波特率完全一致 # timeout=1:读取超时1秒,无数据就不再阻塞等待 ser = serial.Serial("COM3", 9600, timeout=1) # 2. 向单片机发送字符串 # 字符串前面加 b 代表转为字节流,串口只认二进制字节 # \r\n 是串口常用换行结束符,匹配单片机串口接收判断 ser.write(b"hello mcu\r\n") # 3. 读取单片机发回来的一行数据(读到换行就停止) recv_data = ser.readline() # 4. 字节转utf-8字符串并打印到终端 print("串口收到:", recv_data.decode("utf-8")) # 5. 程序结束必须关闭串口,否则下次打开会报错占用 ser.close()3. 逐行代码详细讲解
import serial引入串口驱动库,不写这行无法调用串口相关函数,和 C 语言引入头文件逻辑一样。ser = serial.Serial("COM3", 9600, timeout=1)创建串口实例ser,三个核心参数:
- 串口号:电脑设备管理器 → 端口 (COM 和 LPT) 查看,比如 COM4、COM5
- 波特率:9600/115200 等,必须和单片机代码配置一模一样,否则乱码
- timeout:超时时间,单位秒;设为 1 代表 1 秒没读到数据直接返回空,不会卡死程序
ser.write(b"hello mcu\r\n")串口发送函数:
- 串口底层只传输字节,普通字符串要加前缀
b转成字节数据 \r\n回车换行,大部分单片机串口程序以换行作为一帧数据结束标记
recv_data = ser.readline()按行读取串口数据,只要收到\n就停止读取,返回收到的全部字节;超时无数据返回空字节。recv_data.decode("utf-8")串口返回的是二进制字节,decode("utf-8")将字节转换成我们能看懂的中文 / 英文文本。ser.close()关闭串口释放资源,忘记关闭会出现「串口被占用,无法打开」报错,每次程序结束都要执行。
4. 常见踩坑解决(硬件新手必看)
报错
FileNotFoundError: [Errno 2] could not open port COM3解决:串口号写错,去电脑设备管理器确认真实 COM 编号;检查 USB 转串口驱动是否装好。收到全是乱码 解决:Python 代码波特率、单片机波特率不一致;单片机编码不是 UTF-8,可换成
.decode("gbk")尝试。运行一次后再运行报串口占用 解决:代码末尾加
ser.close();关闭其他串口助手、单片机下载软件。收不到任何返回数据 解决:硬件 TX/RX 交叉接线(单片机 TX 接 USB 模块 RX,单片机 RX 接 USB 模块 TX);确认单片机收到指令后有返回数据逻辑。
5. 运行演示效果
单片机收到hello mcu后回复I'm MCU,终端输出:
串口收到: I'm MCU拓展:循环持续接收数据(硬件调试专用 + 逐行注释讲解)
# 导入串口通信库,用于读写硬件串口 import serial # 导入时间库,用于循环延时,降低CPU占用 import time # 初始化串口对象:串口号COM3、波特率9600、读取超时0.5秒 ser = serial.Serial("COM3", 9600, timeout=0.5) print("串口已打开,持续接收数据,按Ctrl+C停止") # try-except异常捕获:处理用户按下Ctrl+C强制停止程序的场景 try: # while True 无限循环,持续监听串口 while True: # readline() 读取串口一行数据,读到换行符\n返回;超时无数据返回空字节 data = ser.readline() # 判断:如果data不为空,代表读到了单片机发送的数据 if data: # decode("utf-8"):二进制字节转可读字符串 # .strip():自动删掉首尾换行、空格、回车,打印更整洁 print("收到:", data.decode("utf-8").strip()) # 延时0.1秒,避免死循环疯狂占用电脑CPU资源 time.sleep(0.1) # 捕获 KeyboardInterrupt 异常:用户在终端按下 Ctrl+C 终止程序时触发 except KeyboardInterrupt: # 关闭串口,释放硬件资源,防止串口被占用、下次打不开 ser.close() print("串口已关闭,程序退出")逐行分段详细说明
1. 头文件导入
import serial import timeimport serial:串口操作核心库,没有它无法和 USB 转串口、单片机通信import time:提供sleep()延时函数,缓解无限循环对 CPU 的消耗
2. 串口初始化
ser = serial.Serial("COM3", 9600, timeout=0.5) print("串口已打开,持续接收数据,按Ctrl+C停止")"COM3":你的 USB 串口设备编号,设备管理器里查看,需要按需修改9600:波特率,必须和单片机代码波特率完全一致,否则乱码timeout=0.5:读取超时 0.5 秒,超过 0.5 秒没收到数据直接返回空,程序不会卡死
3. try 异常保护块
try: while True:try:把主循环放进异常捕获区,作用是优雅退出while True:无限循环,实现持续监听串口数据流,不用每次运行一次代码
4. 串口读取 + 打印逻辑
data = ser.readline() if data: print("收到:", data.decode("utf-8").strip()) time.sleep(0.1)ser.readline()按一行读取b串口数据,遇到\n换行符就结束本次读取;0.5 秒没数据返回空字节'b'if data:只有真正读到数据时才打印,避免不停输出空行data.decode("utf-8")串口底层传输二进制字节,这行把字节转换成中文 / 英文可读文本.strip()自动清除字符串前后的\r、\n、空格,打印结果干净整洁,不会出现多余空行time.sleep(0.1)每次循环停顿 0.1 秒,降低循环频率,防止程序满载占用 CPU
5. except 退出处理(重点!硬件调试必加)
except KeyboardInterrupt: ser.close() print("串口已关闭,程序退出")KeyboardInterrupt:专属捕获用户按下Ctrl + C停止程序的异常ser.close():强制关闭串口释放硬件端口 不写这行的坑:直接关终端终止程序,串口会被系统锁住,下次运行代码会报「串口被占用,无法打开」- 最后打印提示文字,告知用户串口正常关闭
使用场景说明
- 适合单片机持续上报数据:温湿度、电压、传感器数值实时打印
- 替代串口助手,用 Python 做自动化数据采集,后续可以扩展:把数据保存到文件、绘图
- 支持随时快捷键退出,不会卡死串口,硬件调试非常稳定
运行效果示例
单片机循环发送temp:25.5、temp:25.6,终端输出:
串口已打开,持续接收数据,按Ctrl+C停止 收到: temp:25.5 收到: temp:25.6 收到: temp:25.4 # 按下 Ctrl+C 后输出 串口已关闭,程序退出常见修改点
- 改串口号:
"COM3"→"COM4"(设备管理器查看) - 改波特率:
9600→115200(和单片机程序匹配) - 加快响应速度:
time.sleep(0.1)→time.sleep(0.05) - 中文乱码:
decode("utf-8")→decode("gbk")