树莓派Python串口通信:解锁硬件交互,从零开始的实战编程指南238
各位树莓派爱好者们,大家好!我是你们的中文知识博主。今天,我们要一起踏上一段激动人心的旅程——用Python在树莓派上进行串口通信。如果你曾经梦想着让你的树莓派与各种传感器、模块甚至其他微控制器(比如Arduino)“对话”,那么串口通信就是那把解锁硬件世界的金钥匙。它不仅是DIY项目的核心,更是物联网(IoT)应用中不可或缺的底层技术。
在本篇文章中,我将带你从零开始,一步步掌握树莓派Python串口编程的奥秘。我们将涵盖串口通信的基础知识、树莓派上的环境配置、强大的`pyserial`库的使用,并通过实战代码示例让你亲手实现数据收发。无论你是初学者还是有一定经验的玩家,相信读完本文,你都能信心满满地开始你的硬件交互之旅!
一、串口通信知多少:基本概念与工作原理
在深入编程之前,我们先来了解一下什么是串口通信。串口(Serial Port),顾名思义,就是数据一位接一位地进行传输。与并行通信一次传输多位数据不同,串口通信就像一条单行道,虽然慢点,但线路简单、成本低廉,非常适合连接各种外围设备。
在串口通信中,有几个关键参数需要我们了解:
 波特率(Baud Rate):表示每秒传输的位数,例如9600、115200。通信双方的波特率必须一致,否则将无法正常通信。
 数据位(Data Bits):每帧数据中实际包含的数据位数,通常是8位。
 停止位(Stop Bits):用于表示一帧数据的结束,通常是1位。
 校验位(Parity Bit):用于检测数据传输错误,可以是无校验(None)、奇校验(Odd)或偶校验(Even)。为了简化,很多应用场景选择无校验。
在树莓派上,我们主要会使用其GPIO引脚上的UART接口进行串口通信,或者通过USB转串口模块来实现。
二、树莓派串口环境配置:准备你的“对话”通道
想要让树莓派的串口“活”起来,我们首先需要进行一些必要的配置。
2.1 GPIO串口(UART)配置
树莓派的GPIO引脚上有一个硬件UART(通用异步收发传输器),通常对应`/dev/ttyS0`或`/dev/ttyAMA0`(取决于树莓派型号和系统版本)。默认情况下,这个串口可能被用于系统控制台输出或蓝牙模块。我们需要对其进行修改。
步骤:
 禁用串口控制台:
 
打开终端,输入`sudo raspi-config`。
选择 `3 Interface Options` -> `P6 Serial Port`。
当询问 `Would you like a login shell to be accessible over serial?` 时,选择 `No`。
当询问 `Would you like the serial port hardware to be enabled?` 时,选择 `Yes`。
保存并退出,重启树莓派:`sudo reboot`。 
 确认串口设备名:
 
重启后,硬件UART通常会被映射到`/dev/ttyS0`。你可以通过`ls /dev/ttyS*`来确认。 
 添加用户到`dialout`组:
 
为了让非root用户也能访问串口,需要将当前用户(通常是`pi`)添加到`dialout`组。
 sudo usermod -aG dialout pi
 
执行后需要重启或注销再登录才能生效。 
2.2 USB转串口模块配置
如果你使用USB转串口模块(如PL2303、CP2102、FT232等),配置会简单得多。
步骤:
 将USB转串口模块连接到树莓派的USB端口。
 模块通常会自动被识别,并创建`/dev/ttyUSB0`、`/dev/ttyUSB1`等设备文件。你可以通过`ls /dev/ttyUSB*`来查看。
 同样,确保你的用户在`dialout`组中,拥有访问权限。
USB转串口模块的优点是稳定可靠,且不会占用树莓派的GPIO引脚,适合多个串口设备连接。
三、Python的“串口之魂”:`pyserial`库
在Python中进行串口通信,`pyserial`库是事实上的标准,功能强大且易于使用。
3.1 安装`pyserial`
打开终端,使用pip安装:
pip install pyserial
如果遇到权限问题,可以尝试`pip3 install pyserial`或`sudo pip install pyserial`。
3.2 `pyserial`核心用法
`pyserial`库通过`Serial`类来封装串口操作。
创建Serial对象:
import serial
# 初始化串口
# port: 串口设备名,例如 '/dev/ttyS0' 或 '/dev/ttyUSB0'
# baudrate: 波特率,例如 9600, 115200
# timeout: 读取超时时间(秒)。None表示一直等待,0表示非阻塞模式,>0表示等待指定时间。
ser = (
 port='/dev/ttyS0', # 根据实际情况修改串口号
 baudrate=9600,
 bytesize=, # 数据位
 parity=serial.PARITY_NONE, # 校验位
 stopbits=serial.STOPBITS_ONE, # 停止位
 timeout=1 # 读取超时1秒
)
打开和关闭串口:
() # 如果在创建Serial对象时未自动打开,则手动打开
# ... 串口操作 ...
() # 关闭串口
通常,在创建`Serial`对象时,串口会自动打开。如果你想检查串口是否已打开,可以使用`()`。
发送数据:
使用`write()`方法发送数据。注意,`write()`方法只接受字节串(bytes),所以如果你要发送字符串,需要先进行编码(通常是`UTF-8`或`ASCII`)。(b'Hello from Raspberry Pi!') # 发送字节串
('Hello again!'.encode('utf-8')) # 发送字符串并编码为字节串
接收数据:
`pyserial`提供了多种接收数据的方法:
 `(size)`:读取`size`个字节。如果设置了`timeout`,会在超时后返回已读到的数据(可能不足`size`个),或者返回空字节串。
 `()`:读取一行数据,直到遇到换行符``。返回字节串。
 `ser.read_until(expected=b'', size=None)`:读取直到遇到指定字节序列或达到指定大小。
接收到的数据也是字节串,需要解码才能变成可读的字符串。
# 读取10个字节
data = (10)
print(f"Received (bytes): {data}")
print(f"Received (string): {('utf-8')}")
# 读取一行
line = ()
print(f"Received line (bytes): {line}")
print(f"Received line (string): {('utf-8').strip()}") # strip()去除可能的换行符
检查是否有待读取数据:
`ser.in_waiting`属性可以告诉你接收缓冲区中等待读取的字节数。
if ser.in_waiting > 0:
 data = (ser.in_waiting)
 print(f"Received {len(data)} bytes: {('utf-8')}")
四、实战编程示例:让树莓派与硬件“对话”
理论学得再多,不如动手实践。下面我们通过几个简单的示例,让你掌握串口数据收发。
4.1 示例一:树莓派发送数据
这个例子展示了树莓派如何向另一个串口设备(例如,连接到电脑上的串口调试助手或另一个微控制器)发送数据。
import serial
import time
try:
 ser = (
 port='/dev/ttyS0', # 替换为你的串口号,如'/dev/ttyUSB0'
 baudrate=9600,
 timeout=1
 )
 if ():
 print(f"串口 {} 打开成功,波特率 {}")
 count = 0
 while True:
 message = f"Hello from RPi! Count: {count}"
 (('utf-8')) # 发送编码后的数据
 print(f"发送: {()}")
 count += 1
 (2) # 每2秒发送一次
 else:
 print(f"串口 {} 打开失败")
except as e:
 print(f"串口错误: {e}")
except KeyboardInterrupt:
 print("程序被用户中断。")
finally:
 if 'ser' in locals() and ():
 ()
 print("串口已关闭。")
运行此脚本后,如果你用串口调试助手连接到树莓派的对应串口,应该能看到“Hello from RPi!”的信息不断发送过来。
4.2 示例二:树莓派接收数据
这个例子演示了树莓派如何从外部串口设备接收数据。你可以用串口调试助手向树莓派发送一些信息来测试。
import serial
import time
try:
 ser = (
 port='/dev/ttyS0', # 替换为你的串口号
 baudrate=9600,
 timeout=1 # 读取超时1秒
 )
 if ():
 print(f"串口 {} 打开成功,波特率 {}")
 print("等待接收数据...")
 while True:
 if ser.in_waiting > 0: # 如果接收缓冲区有数据
 received_data = () # 读取一行数据
 try:
 # 尝试解码为UTF-8字符串,并去除首尾空白符(包括换行符)
 message = ('utf-8').strip()
 print(f"收到: {message}")
 except UnicodeDecodeError:
 print(f"收到无法解码的数据 (bytes): {received_data}")
 (0.1) # 短暂延时,避免CPU空转
 else:
 print(f"串口 {} 打开失败")
except as e:
 print(f"串口错误: {e}")
except KeyboardInterrupt:
 print("程序被用户中断。")
finally:
 if 'ser' in locals() and ():
 ()
 print("串口已关闭。")
运行脚本后,从你的串口调试助手发送一些文字,树莓派的终端就会打印出接收到的信息。
4.3 示例三:简单交互——发送命令并接收响应
更复杂的应用场景通常涉及发送命令并等待设备响应。这里我们模拟一个简单的问答机制。
import serial
import time
try:
 ser = (
 port='/dev/ttyS0', # 替换为你的串口号
 baudrate=9600,
 timeout=2 # 接收响应的超时时间
 )
 if ():
 print(f"串口 {} 打开成功,波特率 {}")
 
 while True:
 command = input("请输入命令 (如: GET_TEMP, GET_HUMIDITY, EXIT): ").strip().upper()
 if command == "EXIT":
 break
 
 send_msg = (command + "").encode('utf-8')
 (send_msg)
 print(f"发送命令: {command}")
 
 # 等待接收响应
 response = ()
 if response:
 try:
 decoded_response = ('utf-8').strip()
 print(f"收到响应: {decoded_response}")
 except UnicodeDecodeError:
 print(f"收到无法解码的响应 (bytes): {response}")
 else:
 print("未收到响应。")
 (1) # 间隔1秒进行下一次交互
 
 else:
 print(f"串口 {} 打开失败")
except as e:
 print(f"串口错误: {e}")
except KeyboardInterrupt:
 print("程序被用户中断。")
finally:
 if 'ser' in locals() and ():
 ()
 print("串口已关闭。")
为了测试这个例子,你可能需要一个能响应特定命令的微控制器(如Arduino),或者一个能模拟响应的串口调试助手。例如,当树莓派发送`GET_TEMP`时,对方应该发送回`TEMP: 25.5C`。
五、常见问题与调试技巧
串口通信虽然强大,但也可能遇到各种问题。
 Permission denied:这是最常见的问题,通常是因为当前用户没有访问串口的权限。请确保你已将用户添加到`dialout`组:`sudo usermod -aG dialout pi`,并重启。
 串口设备不存在:检查你的串口设备名是否正确(`/dev/ttyS0`、`/dev/ttyUSB0`等)。
 波特率不匹配:通信双方的波特率必须完全一致。
 数据编码/解码错误:Python的字符串和字节串是不同的。发送前请`encode()`,接收后请`decode()`。确保使用相同的编码(如`utf-8`)。
 超时问题(timeout):如果`read()`或`readline()`迟迟收不到数据,可能是`timeout`设置不当。`timeout=None`会一直阻塞,`timeout=0`是非阻塞,而`timeout > 0`会等待指定时间。根据你的应用场景选择。
 硬件连接问题:检查TX/RX是否正确交叉连接,以及地线(GND)是否连接。
 使用串口调试工具:`minicom`或`screen`是Linux下常用的串口调试工具,可以用来独立测试串口是否正常工作。例如:`sudo apt-get install minicom`,然后`minicom -b 9600 -D /dev/ttyS0`。
六、进阶应用与展望
掌握了基本的串口收发,你就可以开始构建更复杂的项目了。
 数据采集与传感器:连接DHT11/DHT22温湿度传感器、GPS模块、各种气象传感器等,通过串口读取数据并进行分析或上传云端。
 设备控制:控制LED灯、电机、继电器等执行器,实现智能家居自动化。
 与其他微控制器通信:树莓派作为“大脑”,与Arduino、ESP32等微控制器进行数据交换,发挥各自优势。
 自定义协议:当数据量大或需要更高可靠性时,可以设计自己的通信协议,包含数据包头、长度、校验和等,提高通信稳定性。
 多线程通信:在复杂的应用中,可以考虑使用多线程,将串口通信放在单独的线程中运行,避免阻塞主程序。
结语
恭喜你,现在你已经掌握了树莓派Python串口通信的基础知识和实战技巧!串口通信是连接数字世界与物理世界的重要桥梁,它让你的树莓派不再是一个孤立的计算盒子,而是能够与各种硬件设备“对话”的智能中枢。
记住,编程和硬件交互都是一个不断尝试、学习和解决问题的过程。不要害怕出错,每一次错误都是宝贵的学习机会。从现在开始,发挥你的创意,利用树莓派和Python串口通信,去构建那些你曾经梦想过的DIY项目和物联网应用吧!如果你在实践中遇到任何问题,欢迎随时留言交流,我乐意为你提供帮助。
2025-11-04
零基础Python入门:小白也能快乐上手的编程指南
https://jb123.cn/python/71569.html
Python Qt桌面应用开发:极速上手PyQt/PySide,打造专业级GUI
https://jb123.cn/python/71568.html
深入浅出 Python 元编程:从装饰器到元类,全面掌握代码生成艺术
https://jb123.cn/python/71567.html
Perl字符串比较的奥秘:从`eq`到Unicode的深度解析
https://jb123.cn/perl/71566.html
Perl编程入门:掌握核心语法命令,玩转文本处理与系统自动化!
https://jb123.cn/perl/71565.html
热门文章
Python 编程解密:从谜团到清晰
https://jb123.cn/python/24279.html
Python编程深圳:初学者入门指南
https://jb123.cn/python/24225.html
Python 编程终端:让开发者畅所欲为的指令中心
https://jb123.cn/python/22225.html
Python 编程专业指南:踏上编程之路的全面指南
https://jb123.cn/python/20671.html
Python 面向对象编程学习宝典,PDF 免费下载
https://jb123.cn/python/3929.html