Python串口通信详解:从基础到高级
off999 2024-09-27 13:55 53 浏览 0 评论
串口通信在嵌入式系统、传感器网络以及各种设备间的数据交换中扮演着重要的角色。Python提供了serial模块,使得串口通信的实现变得简单而灵活。本文将深入介绍Python中串口通信的各个方面,提供详细的示例代码,让大家能够全面掌握这一技术。
安装pyserial模块
首先,确保已经安装了pyserial模块。如果没有安装,使用以下命令:
pip install pyserial打开和关闭串口
import serial
# 打开串口
ser = serial.Serial('COM1', 9600)
if ser.is_open:
print("串口已打开")
# 关闭串口
ser.close()
if not ser.is_open:
print("串口已关闭")读写操作基础
# 写入数据到串口
ser.write(b'Hello, Serial!')
# 从串口读取数据
data = ser.readline()
print(data.decode('utf-8'))配置串口参数
ser.baudrate = 115200
ser.parity = serial.PARITY_ODD
ser.stopbits = serial.STOPBITS_TWO异步读写操作
import threading
import time
# 异步读取数据
def read_serial():
while True:
data = ser.readline()
print(data.decode('utf-8'))
# 创建线程并运行
thread = threading.Thread(target=read_serial)
thread.start()
# 异步写入数据
ser.write(b'Async Write Operation')使用上下文管理器
# 使用上下文管理器自动关闭串口
with serial.Serial('COM1', 9600) as ser:
ser.write(b'Hello')
data = ser.readline()
print(data.decode('utf-8'))错误处理与异常
try:
ser = serial.Serial('COM1', 9600)
ser.write(b'Hello')
except serial.SerialException as e:
print(f"Serial Port Error: {e}")
finally:
if ser.is_open:
ser.close()应用实例:Arduino与Python串口通信
import serial
import time
ser = serial.Serial('COM3', 9600, timeout=1)
try:
while True:
ser.write(b'1')
data = ser.readline().decode('utf-8').strip()
print(f"Received from Arduino: {data}")
time.sleep(1)
except KeyboardInterrupt:
print("Serial Communication Stopped.")
finally:
if ser.is_open:
ser.close()数据解析与协议处理
在实际应用中,与硬件设备进行串口通信通常需要解析数据和处理通信协议。以下是一个简单的例子,假设从串口接收的数据是用逗号分隔的两个整数,需要解析并进行处理。
def parse_serial_data(data):
try:
values = data.decode('utf-8').strip().split(',')
if len(values) == 2:
value1, value2 = map(int, values)
print(f"Parsed Data: Value1={value1}, Value2={value2}")
else:
print("Invalid data format.")
except ValueError as e:
print(f"Error parsing data: {e}")
# 从串口读取数据并解析
data_from_serial = ser.readline()
parse_serial_data(data_from_serial)可视化串口数据
对串口通信进行可视化有助于实时监测数据流。使用matplotlib库可以轻松实现简单的数据可视化。
import matplotlib.pyplot as plt
from collections import deque
# 初始化数据缓存
buffer_size = 50
data_buffer = deque(maxlen=buffer_size)
# 实时绘制数据
def plot_serial_data(data):
try:
values = data.decode('utf-8').strip().split(',')
if len(values) == 2:
data_buffer.appendleft(int(values[0]))
# 绘制数据
plt.plot(data_buffer)
plt.title('Real-time Serial Data Plot')
plt.xlabel('Index')
plt.ylabel('Value')
plt.pause(0.1)
plt.clf()
except ValueError as e:
print(f"Error parsing data: {e}")
# 从串口读取数据并实时绘制
try:
while True:
data_from_serial = ser.readline()
plot_serial_data(data_from_serial)
except KeyboardInterrupt:
print("Serial Communication and Plotting Stopped.")
finally:
if ser.is_open:
ser.close()这个例子演示了如何使用matplotlib库实时绘制从串口接收的数据,通过不断更新数据缓存并绘制,可以实现实时的数据可视化效果。
多线程串口通信
为了避免串口通信对主线程的阻塞,可以将串口读写操作放入独立的线程中。
以下是一个简单的多线程串口通信的例子:
import serial
import threading
import time
# 打开串口
ser = serial.Serial('COM1', 9600, timeout=1)
# 异步读取数据的线程函数
def read_serial():
while True:
data = ser.readline()
print(data.decode('utf-8'))
# 创建并运行线程
thread = threading.Thread(target=read_serial)
thread.start()
try:
# 主线程中异步写入数据
while True:
ser.write(b'Async Write Operation')
time.sleep(1)
except KeyboardInterrupt:
print("Serial Communication Stopped.")
finally:
# 等待读取线程结束后再关闭串口
thread.join()
if ser.is_open:
ser.close()这个例子中,创建了一个读取串口数据的线程,通过threading模块的Thread类来实现。主线程中仍然可以异步执行其他操作,而不会被串口读取的阻塞所影响。
使用队列进行线程通信
为了在主线程和串口读取线程之间进行数据传递,可以使用queue模块中的队列。
以下是一个使用队列进行线程通信的例子:
import serial
import threading
import queue
import time
# 打开串口
ser = serial.Serial('COM1', 9600, timeout=1)
# 创建队列
data_queue = queue.Queue()
# 异步读取数据的线程函数
def read_serial():
while True:
data = ser.readline()
data_queue.put(data)
# 创建并运行线程
thread = threading.Thread(target=read_serial)
thread.start()
try:
# 主线程中异步写入数据
while True:
ser.write(b'Async Write Operation')
time.sleep(1)
# 从队列中获取读取线程的数据
while not data_queue.empty():
received_data = data_queue.get()
print(received_data.decode('utf-8').strip())
except KeyboardInterrupt:
print("Serial Communication Stopped.")
finally:
# 等待读取线程结束后再关闭串口
thread.join()
if ser.is_open:
ser.close()这个例子中,主线程通过data_queue.put(data)将串口读取的数据放入队列,然后在主线程中通过data_queue.get()获取数据。这种方式实现了线程间的安全通信。
总结
在这篇文章中,全面而深入地探讨了Python中串口通信的各个方面,从基础的串口配置、读写操作,到高级的异步读写、数据解析与协议处理,再到多线程串口通信和使用队列进行线程通信,提供了丰富的示例代码,能够全面掌握这一关键技术。
首先,学习了如何安装pyserial模块以及如何打开和关闭串口。通过基础的读写操作,理解了如何向串口写入数据以及如何从串口读取数据。然后,深入讨论了串口参数的配置,包括波特率、校验位和停止位等,以满足不同设备的通信需求。通过示例,学习了如何使用异步读写操作,提高了串口通信的效率。还介绍了如何处理异常和错误,以保证程序的稳定性。与此同时,展示了如何与硬件设备进行串口通信,以Arduino为例,使得这一技术更具实际应用的指导性。
进一步,探讨了数据解析与协议处理的重要性,展示了如何从串口接收的原始数据中提取有用的信息。最后,通过多线程和队列的应用,使串口通信与其他任务并行执行,提高了程序的灵活性和实时性。总体而言,本文为大家提供了一个全面的Python串口通信指南,涵盖了从基础到高级的知识点,并通过丰富的示例代码使得大家能够更好地理解和应用这一关键技术。
相关推荐
- bios能看到硬盘 开机找不到硬盘
-
bios里可以看到硬盘,说明硬盘已经被主板识别。进系统找不到,可能硬盘没分区,或者硬盘是动态磁盘,还没有导入或激活。按win+r,输入diskmgmt.msc回车,就打开磁盘管理了,在里面可以给新硬盘...
- 无线网有个红叉(无线网有个红叉,搜索不到网络)
-
连接失败,路由坏换路由,外网坏,报修无线网络处出现红叉表示设备无法正常工作。请检查网卡驱动是否正常,无线网络开关是否打开。解决方法:查看电脑是否有无线网络开关,且是否打开。进入设备管理器检查网卡驱动是...
- thinkpad笔记本官网首页(thinkpad官方商城)
-
官方网站 国内:http://www.thinkworld.com.cn 国内用户只需要访问国内即可。 ThinkPad,中文名为“思考本”,在2005年以前是IBMPC事业部旗下的便携式计算机...
- win7什么版本最好用(win7哪个版本最稳定流畅)
-
Windows7旗舰版,最好,最稳定。Windows7,是由微软公司(Microsoft)开发的操作系统,内核版本号为WindowsNT6.1。Windows7可供选择的版本有:简易版(Sta...
- win7自带虚拟光驱怎么使用(win7系统虚拟光驱安装教程)
-
以DAEMONTools为例,360软件管家里面就有最新版的下.安装后使用方法如下:第一种方法:在虚拟光驱界面中,你先按一下中间工具栏最左边“+”符号的按钮,添加镜像文件(可以一次添加多个),这...
- 电脑装系统蓝屏(电脑装系统蓝屏重启开不了机)
-
蓝屏的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等。解决办法:1、病毒的原因。使用电脑管家杀毒。2、内存的原因。用橡皮擦把内存条的金手指擦拭一下,把氧化层擦掉,确保内存条安装、运行正常。...
- u盘安装软件(u盘安装软件到电视)
-
第一种情况:软件安装包可以直接下载的。在电脑上将软件安装包下载到本地硬盘,然后将下载好软件安装包拷贝到U盘上即可拿到别的电脑上去安装。分可为exe格式的和rar格式,exe格式直接安装,rar格式的解...
- microsoft官网账户注册(microsoft 帐户注册)
-
要创建Microsoft账户,您可以按照以下步骤进行操作:1.打开任意一个支持浏览器的设备,如电脑、手机或平板电脑。2.在浏览器中输入"Microsoft账户注册"或直接访问Mic...
- 显示器闪屏是什么原因(显示器闪屏是哪里坏了)
-
解决方法: 一、接触不良导致的显示器闪屏 先查看主机和显示器的电源线连接,是否松动,重新插拔一下电源线。 二、信号干扰导致的显示器闪屏 1、连接显示器的电缆线是否没有屏蔽线圈,如果没有防干扰的...
- 国产linux操作系统(国产linux操作系统有什么版本)
-
中国对于操作系统的探索其实并不晚。 早在20世纪60年代中期中国就开始操作系统的研发,那时的比尔·盖茨还只是个迷恋计算机的小字辈,南京大学教授孙钟秀、北京大学杨芙清院士等都是我国操作系统的拓荒者...
- 免费无需排队的云电脑(不需要排队的云电脑)
-
目前市场上有一些云游戏平台提供无限时长且无需排队的服务。这些平台通常采用先进的云计算技术和高性能服务器,能够提供稳定流畅的游戏体验。用户可以随时登录并畅玩游戏,无需等待排队。这些平台还提供多种游戏选择...
- wps官方下载(wps官方下载官网电脑版网址)
-
具体的步骤如下:1、首先在电脑上打开浏览器,在浏览器中输入“WPS”,找到WPS官方网站。2、接下来进入WPS官方网站中,找到WPS软件,点击“免费下载”。3、点击下载后在弹出来的对话框中修改下载位置...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
