当前位置: 首页 > news >正文

Python的串口通信库

一、串口通信基础

1.1 串口通信概述

串口通信(Serial Communication),也称为串行通信,是一种将数据位按顺序一位一位地传输的通信方式。与并行通信相比,串口通信在传输速度上可能稍逊一筹,但其具有传输线少、成本低、易于实现远距离通信等优点,因此广泛应用于各种嵌入式系统、仪器仪表、计算机外设等领域。

1.2 RS-232、RS-485与RS-422

在串口通信中,最常见的标准包括RS-232、RS-485和RS-422。RS-232是最早也是最常用的标准之一,它定义了数据终端设备(DTE)和数据通信设备(DCE)之间的物理接口和电气特性。然而,RS-232的传输距离有限(通常不超过15米),且信号电平较高,不适合长距离和高速率的通信。相比之下,RS-485和RS-422则采用了差分信号传输技术,具有更强的抗干扰能力和更远的传输距离,适用于工业现场等恶劣环境。

1.3 波特率与数据格式

串口通信中的波特率(Baud Rate)表示每秒传输的符号数(或比特数),是衡量数据传输速度的重要指标。常见的波特率有9600、19200、38400、57600、115200等。此外,串口通信还需要定义数据格式,包括数据位(Data Bits)、停止位(Stop Bits)和校验位(Parity Bit)等参数,以确保数据的正确传输和接收。

二、Python串口通信库:pyserial

2.1 pyserial简介

pyserial是Python中用于串口通信的一个非常流行的第三方库。它提供了一个简单的接口来访问串行端口,使得Python程序能够轻松地与串口设备进行数据交换。pyserial支持Windows、Linux和MacOS等多个操作系统平台,并且与Python的标准库(如threadingselect等)无缝集成,方便用户进行多线程、非阻塞等高级编程。

2.2 pyserial的安装

安装pyserial非常简单,可以通过Python的包管理工具pip直接安装:

pip install pyserial
安装完成后,即可在Python代码中导入并使用pyserial了。

2.3 pyserial的核心功能

pyserial提供了丰富的API来支持串口通信的各个方面,主要包括以下几个方面:

  • 串口列表获取:可以使用serial.tools.list_ports.comports()函数列出当前系统中可用的串口。
  • 串口对象创建:通过serial.Serial()类创建一个串口对象,并指定端口名、波特率、数据位、停止位、校验位等参数。
  • 数据读写:串口对象提供了read()readline()readlines()等方法来读取数据,以及write()方法来发送数据。
  • 串口配置:可以在创建串口对象时指定配置参数,也可以在对象创建后通过修改属性来动态调整配置。
  • 流控制:支持硬件流控制和软件流控制,以应对不同场景下的数据传输需求。
  • 超时设置:可以设置读写操作的超时时间,以避免程序因等待数据而陷入无限循环。
三、pyserial实战应用

3.1 基本串口通信示例

以下是一个使用pyserial进行基本串口通信的示例代码:

import serial  
import time  # 创建串口对象  
ser = serial.Serial('COM3', 9600, timeout=1)  # 假设串口名为COM3,波特率为9600  try:  # 发送数据  ser.write(b'Hello, Serial Port!\n')  # 注意发送的是字节串  # 接收数据  while True:  if ser.in_waiting > 0:  # 判断缓冲区中是否有数据  incoming_data = ser.readline().decode('utf-8').rstrip()  # 读取一行数据并解码,去除末尾的换行符  print("Received:", incoming_data)  time.sleep(0.1)  # 稍作延时,避免过度占用CPU  except KeyboardInterrupt:  print("Program interrupted by user.")  finally:  # 关闭串口  ser.close()
3.2 多线程串口通信

在实际应用中,经常需要同时处理多个串口或同时进行数据的读写操作。这时,可以使用Python的threading模块来实现多线程串口通信。以下是一个简单的示例:

import serial  
import threading  def read_from_serial(ser):  while True:  if ser.in_waiting > 0:  data = ser.readline().decode('utf-8').rstrip()  print("Received:", data)  # 创建串口对象  
ser = serial.Serial('COM3', 9600, timeout=1)  # 创建并启动读线程  
read_thread = threading.Thread(target=read_from_serial, args=(ser,))  
read_thread.start()  # 主线程可以执行其他任务,如发送数据等  
# ...  # 注意:在实际应用中,通常需要在程序退出前正确地停止线程并关闭串口  
# 这里为了简化示例,省略了这些步骤
3.3 错误处理与异常捕获

在进行串口通信时,可能会遇到各种异常情况,如串口打开失败、读写超时、数据格式错误等。因此,在编写串口通信程序时,需要合理地处理这些异常情况。pyserial本身会抛出一些异常来指示错误情况,如serial.SerialExceptionserial.SerialTimeoutException等。开发者可以通过try-except语句来捕获这些异常,并采取相应的处理措施。

四、pyserial的高级应用

4.1 非阻塞串口通信

在某些场景下,需要实现非阻塞的串口通信,即在没有数据可读时,程序不会停留在读操作上等待,而是继续执行其他任务。pyserial本身并不直接支持非阻塞模式,但可以通过设置超时时间或使用selectpoll等机制来实现类似的效果。

4.2 串口通信的流控制

pyserial支持硬件流控制和软件流控制。硬件流控制通常通过串口线的RTS/CTS或DTR/DSR信号来实现,而软件流控制则通过特定的字符(如XON/XOFF)来控制数据的发送和接收。在使用流控制时,需要根据实际设备和通信协议的要求来选择合适的流控制方式。

4.3 串口数据的解析与处理

串口接收到的数据通常是原始的字节流,需要根据具体协议进行解析和处理才能得到有意义的信息。这可能需要编写额外的解析代码,或使用现有的解析库来辅助完成。在处理复杂的数据格式时,还需要考虑数据的同步、校验和错误恢复等问题。

五、pyserial与其他技术的集成

5.1 与GUI框架的集成

在开发具有图形用户界面的串口通信程序时,可以将pyserial与Python的GUI框架(如Tkinter、PyQt、wxPython等)集成起来。通过GUI框架提供的控件和事件处理机制,可以方便地实现串口配置、数据显示、用户交互等功能。

5.2 与网络技术的集成

在某些应用场景下,需要将串口数据通过网络传输到远程服务器或客户端。这时,可以将pyserial与Python的网络编程库(如socket、requests等)集成起来,实现串口数据与网络数据的转换和传输。此外,还可以使用TCP/IP协议、MQTT协议等网络通信协议来优化数据传输的效率和可靠性。

5.3 与数据库的集成

在某些需要持久化存储串口数据的场景中,可以将pyserial与Python的数据库编程库(如sqlite3、pymysql、psycopg2等)集成起来。通过数据库提供的存储和查询功能,可以方便地管理串口数据,并为其他应用程序提供数据支持。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【学习笔记】手写Tomcat 四
  • 文件操作(3)
  • Python套接字
  • 植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
  • 一些线上常用排查问题的命令
  • 深度学习之概率论预备知识点(3)
  • CVE-2024-46103
  • 深度学习02-pytorch-08-自动微分模块
  • Qt/C++开发经验
  • vue2使用npm引入依赖(例如axios),报错Module parse failed: Unexpected token解决方案
  • 【零散技术】Odoo17通过Controller下载PDF
  • js-利用创建a便签实现下载文件功能
  • AUTOSAR_EXP_ARAComAPI的5章笔记(9)
  • C语言数组学习
  • 语言的条件语句
  • Less 日常用法
  • Python实现BT种子转化为磁力链接【实战】
  • text-decoration与color属性
  • webpack入门学习手记(二)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 当SetTimeout遇到了字符串
  • 分类模型——Logistics Regression
  • 关于使用markdown的方法(引自CSDN教程)
  • 汉诺塔算法
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 聚类分析——Kmeans
  • 树莓派 - 使用须知
  • 一个完整Java Web项目背后的密码
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #### golang中【堆】的使用及底层 ####
  • #NOIP 2014# day.2 T2 寻找道路
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)(1.13) SiK无线电高级配置(五)
  • (Oracle)SQL优化技巧(一):分页查询
  • (办公)springboot配置aop处理请求.
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (三)模仿学习-Action数据的模仿
  • (十) 初识 Docker file
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .net framework4与其client profile版本的区别
  • .NET 依赖注入和配置系统
  • .NET 中的轻量级线程安全
  • .NET/C# 使窗口永不获得焦点
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • // an array of int
  • @Bean注解详解