Python模拟串口通信的示例详解

2025-05-23 02:50

本文主要是介绍Python模拟串口通信的示例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe...

本次分享利用python模拟串口通信案例。当前编程环境,并没有办法接好下位机平台,需要模拟出一个串口,不断发送、接收信息的过程。

串行通信端口(cluster communication port ),简称串口,即COM口。

pySerial 是 Python 中用于操作串口的第三方模块,它支持 Windowslinux、OSX、BSD等多个平台。

1.win 下载虚拟串口

下载: sourceforge.net/projects/com0com/files/latest/download

下载安装完成后,会在设备管理器中新增两个com。

这两个串口是互相接通的,一个com 可以当作上位机,一个com可以当作下位机。创建的一对虚拟串口。

Python模拟串口通信的示例详解

或者利用虚拟串口的软件创建,VSPD(Virtual Serial Port Driver)

2、确定串口号

pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。

import serial
import serial.tools.list_ports
 
# 获取所有串口设备实例。

port_list = list(serial.tools.list_ports.comports())
def show_all_com():
    # 如果找到串口设备,则依次输出每个设备对应的串口号和描述信息。
    port_list_name = []
    if len(port_list) <= 0:
        print("the serial port can't find!")
    else:
        for itms in port_list:
            print(list(itms)[0], list(itms)[1])
            port_list_name.append(itms.device)

    return port_list_name

运行结果

COM1 通信端口 (COM1)
COM3 com0com - serial port emulator (COM3)
COM4 com0com - serial port emulator (COM4)
['COM1', 'COM3', 'COM4']

3、配置串口

import serial
 
# 打开 COM3,将波特率配置为115200,数据位为7,停止位为2,无校验位,读超时时间为0.5秒。
ser = serial.Serial(port="COM3",
                    baudrate=115200,
                    bytesize=serial.SEVENBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_TWO,
             php       timeout=0.5) 

常用的参数如下:

port - 串口设备名或 None。

baudrate - 波特率,可以是50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000。

bytesize - 数据位,可取值为:FIVEBIT编程S, SIXBITS, SEVENBITS, EIGHTBITS。

parity - 校验位,可取值为:PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE。

stopbits - 停止位,可取值为:STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TOW。

xonxoff - 软件流控,可取值为 True, False。

rtscts - 硬件(RTS/CTS)流控,可取值为 True, False。

dsr/dtr - 硬件(DSR/DTR)流控,可取值为 True, False。

timeout - 读超时时间,可取值为 None, 0 或者其他具体数值(支持小数)。当设置为 None 时,表示阻塞式读取,一直读到期望的所有数据才返回;当设置为 0 时,表示非阻塞式读取,无论读取到多少数据都立即返回;当设置为其他数值时,表示设置具体的超时时间(以秒为单位),如果在该时间内没有读取到所有数据,则直接返回。

write_timeout: 写超时时间,可取值为 None, 0 或者其他具体数值(支持小数)。参数值起到的效果参考 timeout 参数。

4、串口通信示例

python 实现向一个串口内写数据(发送端),另一个串口内接受数据(接收端)

1.串口类工具

串口类功能函数组成:打开、关闭、发送数据、接受数据、解析保存数据功能

import serial
from time import sleep
import queue
import time
from datetime import datetime

q = queue.Queue()

class SerialPort:
    def __init__(self, port, buand):
        self.port = serial.Serial(port, buand)
        self.port.close()
        if not self.port.isOpen():
            self.port.open()

    def port_open(self):
        if not self.port.isOpen():
            self.port.open()

    def port_close(self):
        self.port.close()

    #发送数据
    def send_data(self):
        """
        #write() 方法只能发送 bytes 类型的数据,所以需要对字符串进行 encode 编码。
        # write() 方法执行完成后,会将发送的字节数作为返回值。
        """
        while True:   # 循环发送数据
            date = datetime.now().strftime('%H:%M:%S.%f')[:-3]
            print("send:", date)
            self.China编程port.write(date.encode())
            time.sleep(1)

    # 读取数据
    def read_data(self):
        """
        #  read()方法默认一次读取一个字节,可以通过传入参数指定每次读取的字节数;
        read() 方法会将读取的内容作为返回值,类型为 bytes。
        """
        while True:
            count = self.port.inWaiting()
            if count != 0:
                recv = self.port.read(count)
                self.port.flushInput()
                q.put(recv.decode())
                print("receive:",recv.decode())
            sleep(0.5)

    #解析保存数据
    def save_json(self):
        while True:
            if q.empty():
                pass
            else:
                print("队列长度",q.qsize())
                data = q.get()
                print(data)
            sleep(0.1)

2.发送端

开启一个线程定时发送数据

from tools.LoRaSerial import SerialPort
import threading
from time import sleep

if __name__=='__main__':
    baunRate = 115200
    serialPort_w = "COM3"
    mSerial_w = SerialPort(serialPort_w, baunRate)
    t1 = threading.Thread(target=mSerial_w.send_data)
    t1.daemon = True
    t1.start()

    while True:
        sleep(10)

3.接收端

****接收端开启两个线程接收数据:读取数据和解析存储数据。

from tools.LoRaSerial import SerialPort
import threading
from time import sleep

if __name__=='__main__':
    threads=[]
    baunRate = 115200

    serialPort_r = "COM4"
    mSerial_r = SerialPort(serialPort_r, baunRate)

    t2 = threading.Thread(target=mSerial_r.read_data)
    threads.append(t2)

    t3 = threading.Thread(target=mSerial_r.save_json)
    threads.append(t3)

    for t in threads:
        t.start()

    while True:
        sleep(10)

5.运行结果

Python模拟串口通信的示例详解

从一个线程向另一个线程发送数据最安全的方式可能就是使用 queue 库中的队列了。创建一个被多个线程共享的 Queue 对象,这些线程通过使用put() 和 get() 操作来向队列中添加或者删除元素。

**当终端发送数据量较大时,其数据解析也是比较耗时,可以用消息队列缓存接收到的发送端数据,当接收线程进行IO监听时,负责解析线程去消息队列取消息并解析。如下图,将解析过程时间延迟由0.1至2s。
**

Python模拟串口通信的示例详解

为了方便模拟传编程递数据变化效果,这里用时间函数代替的,实际上设备传递具体消息可解析为具体的json数据格式****

消息类别Ori_ID****发送端设备IDdes_ID****接收端设备IDCMD****消息类别VALUE****数组消息方向
上线消息1123Online[]终端—网关
心跳消息1123Heart[{“BATtery”:”60”}]终端—网关
环境信息1123Env[{“temp”:”35”},{“hum”:”66”}]终端—网关
控制指令1123Alarm[{“light”:”on”},{“pump”:”Stop”}]网关—终端
报警消息1231Control[]终端—网关

备注:

1、 上线消息-------终端启动时给网关发送上线的消息,网关返回该终端的各种数据及运行状态

2、 心跳消息--------终端定期发送心跳消息给网关

3、 环境信息--------终端定期上报各种环境参数

4、 控制指令-------网关发送指令给终端,实现对终端的控制,如开灯、关灯等

5、 报警消息-------设备监测到报警信息,发送报警信息给网关

以上就是Python模拟串口通信的示例详解的详细内容,更多关于Python串口通信的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Python模拟串口通信的示例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154736

相关文章

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Spring Cache注解@Cacheable的九个属性详解

《SpringCache注解@Cacheable的九个属性详解》在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、cacheNames、key、key... 目录1.value/cacheNames 属性2.key属性3.keyGeneratjavascriptor

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别