python实现读取串口数据-使用LibModbus库实现一个实时读取串口数据

在工业自动化领域,Modbus协议因其简单、可靠和广泛支持而备受青睐。其中,Modbus RTU(串行通信)以其低成本和易实施性在许多场景中发挥着重要作用。

01
Modbus RTU协议简介
Modbus RTU是一种基于串行通信的Modbus协议,它使用RS-485或RS-232接口,以字节为单位进行数据传输。Modbus RTU协议定义了主从设备之间的通信规则,主设备负责发起请求,从设备则响应请求并返回数据。

02
Python实现Modbus RTU通信的步骤
准备硬件环境 要实现Modbus RTU通信,首先需要准备支持RS-485或RS-232接口的硬件设备,如串口适配器、从设备(如传感器、执行器等)以及连接线材。安装Python库 要实现Modbus RTU通信,我们可以使用Python的第三方库pymodbus。通过pip可以轻松安装该库:


pip install pymodbus

03,导入库文件:

import time
from pymodbus.client.sync import ModbusSerialClient as ModbusClient

注意pymodbus版本下载版本为pymodbus=== 2.5.3
否则导入ModbusSerialClient报错,
新版pymodbus版本导入写法如下:

from pymodbus.client import ModbusSerialClient as ModbusClient

废话不多说,直接上完整代码:

import time
from pymodbus.client.sync import ModbusSerialClient as ModbusClient

# 配置参数
TIMER = 1  # 读取间隔时间(秒)

SERVER_ADDRESS = [1]
START_ADDRESS = 101
START_ADDRESS_2 = 1
QUANTITY = 100
QUANTITY_2 = 4
COM_PORT = "COM8"
BAUD_RATE = 9600


def modbus_master_rtu():
    """
    Modbus RTU主站读取程序:循环从多个Modbus从站地址读取保持寄存器数据,
    将读取结果直接写入指定CSV文件,并在控制台显示。同时具备异常处理能力。

    参数:
    - COM_PORT:串口端口号,如"COM1"或"/dev/ttyS0"
    - BAUD_RATE:串口波特率,如9600、115200等
    - SERVER_ADDRESS:Modbus从站(服务器)地址列表
    - START_ADDRESS:要读取的第一个保持寄存器的地址
    - START_ADDRESS_2: 要读取的第二个保持寄存器的地址
    - QUANTITY:要读取的寄存器数量
    - QUANTITY_2: 要读取的第二组寄存器数量
    - FILE_NAME:保存读取结果的CSV文件名
    - TIMER:读取操作之间的暂停时间(单位:秒)
    """

    # 创建Modbus RTU客户端
    with ModbusClient(method="rtu", port=COM_PORT, baudrate=BAUD_RATE, timeout=1) as client:
        # 无限循环读取数据
        while True:
            # 遍历服务器地址
            for server_address in SERVER_ADDRESS:
                try:
                    # 读取第一组保持寄存器
                    result = client.read_holding_registers(START_ADDRESS, QUANTITY, unit=server_address)
                    # 读取第二组保持寄存器
                    result_2 = client.read_holding_registers(START_ADDRESS_2, QUANTITY_2, unit=server_address)

                    # 处理读取结果
                    if not result.isError() and not result_2.isError():
                        # 控制台输出读取到的寄存器值
                        print(", ".join(map(str, result.registers)))
                        print(", ".join(map(str, result_2.registers)))
                    else:
                        # 输出读取错误信息
                        print(f"Error reading from server address {server_address}: {result}")
                        print(f"Error reading from server address {server_address}: {result_2}")
                except Exception as e:
                    # 输出并捕获异常信息
                    print(f"Error: {e}")

            # 暂停执行,等待下一轮读取
            time.sleep(TIMER)


if __name__ == "__main__":
    modbus_master_rtu()

上述中的在这里插入图片描述
这几个参数要根据自己的调整,之后运行界面如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL——SERVER的建表主要操作

目录 一:数据存储问题 1.表的相关数据 2.表,字段,记录 二:建表 1.创建表头 2. 数据类型 3.保存数据 4.数据冗余 5.使用命令重置表 7.设置主键 一:数据存储问题 1.表的概念 表是数据库的基本单位&#xff…

运维别卷系列 - 云原生监控平台 之 03.prometheus label 实践

文章目录 [toc]label 简介自定义标签relabel_configsregexrelabel_action metric_relabel_configs两者的区别 实践 label 简介 label 对于 Prometheus 来说,属于数据处理的方式,Prometheus 是通过指定的 label 来查询数据 Prometheus 的 target 中实例&…

elasticsearch-head 源码运行

1、下载安装nodejs 地址:Node.js — Run JavaScript Everywhere 2、git下载 elasticsearch-head 源码 地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster 3、使用cmd 进入 elasticsearch-head 目录 4、依次执…

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集 文章目录 代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集01背包问题理论基础一、01背包问题二、…

Redis-如何保证与Mysql数据一致性

文章目录 Redis与Mysql数据一致性的情况有哪些?Redis与Mysql数据保持一致性的方案?同步双写机制删除缓存重新加载机制延迟双删机制利用MQ保持数据一致性 本篇小结 更多相关内容可查看 Redis与Mysql数据一致性的情况有哪些? Redis和MySQL是两…

Dart 3.4 发布:Wasm Native Macros(宏)

Google I/O 的结束,除了 Flutter 3.22 的发布 ,Dart 3.4 也迎来了它是「史诗级」的更新,之所以这么说,就是因为 Wasm Native 的落地和 Macros 的实验性展示。 在此之前,其实我也提前整理过一些对应的内容,…

Web课外练习7

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>照片墙</title><style>body {display: …

基于物联网、大数据的企业智能设备管理系统的实践解读

随着物联网、大数据的迅速发展&#xff0c;智能化设备管理系统已经渗透到我们工作的方方面面。然而&#xff0c;传统企业设备管理也迈入智能化、无纸化的管理趋势。因此&#xff0c;智能设备管理系统有了很大的应用需求&#xff0c;智能设备管理系统以数字化技术&#xff0c;为…

好文推荐:基于热红外的双源能量平衡(TSEB)模型--从植物到全球尺度的蒸散诊断简史

文献 近日&#xff0c;美国农业部农业研究服务局&#xff08;USDA-ARS&#xff09;的科学家们发表了一篇重要的研究论文——“Agricultural and Forest Meteorology” &#xff08;https://www.sciencedirect.com/journal/agricultural-and-forest-meteorology&#xff09;&…

ShellCode详解三

直接进入正题。 在完成正式的shellcode代码导出之前&#xff0c;我们先手动的对代码进行导出&#xff0c;以使各位同学更加了解其原理。 手动注入shellcode 1、我们利用DLE工具找到上一节中我们生成的PE文件的代码段位置 上述图片就是我们的代码段位置 2、利用WinHex工具我…

Kotlin协程实战指南:解锁Android开发高效能新时代

前言 在移动互联网的狂飙突进之中&#xff0c;Android开发领域如同站在风口的勇士&#xff0c;不断接受技术迭代与创新的双重洗礼。在这个快速变化的市场里&#xff0c;用户对应用性能和体验的期待水涨船高&#xff0c;开发者们面临的挑战也越来越大&#xff1a;如何在功能的丰…

php后端通过ajax接口返回二进制数据流,让前端下载excel文件(ajax传递json参数)

//导出数据function exportUser() {var url ?mUser&auserDeal&actexportUser;var data JSON.stringify({user_province:$(#province).val(),user_city: $(#city).val(),user_area: $(#area).val(),user_depart: $(#user_depart).val(),user_offices: $(#user_office…

Jumia跨境电商自养号补单测评的最新技术和策略

Jumia作为非洲最大的电商平台之一&#xff0c;成立于2012年&#xff0c;也是唯一一家真正意义上覆盖全非洲的电商平台&#xff0c;主要覆盖尼日利亚、摩洛哥、埃及、肯尼亚、巴基斯坦、科洛迪瓦等11个国家。 各个站点是分开运营的&#xff0c;各自有独立的前后台&#xff0c;J…

写一个类ChatGPT应用,前后端数据交互有哪几种

❝ 对世界的态度&#xff0c;本质都是对自己的态度 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 最近&#xff0c;公司有一个AI项目&#xff0c;要做一个文档问答的AI产品。前端部分呢&#xff0c;还是「友好借鉴」Cha…

智慧公厕系统:改变“上厕所”体验的科技革新

公共厕所是城市建设中不可或缺的基础设施&#xff0c;然而&#xff0c;由于较为落后的管理模式&#xff0c;会常常存在着管理不到位、脏乱差的问题。为了改善公厕的使用体验&#xff0c;智慧公厕系统应运而生&#xff0c;并逐渐成为智慧城市建设的重要组成部分。本文将以智慧公…

德昂信息-Wyn助力构建HR人员信息分析看板

”葡萄城的Wyn商业智能软件产品为德昂信息提供了强大的支持&#xff0c;借助Wyn商业智能软件&#xff0c;可以通过可视化方式展示整个公司的人员信息及其分析看板。“ ——德昂信息技术(北京)有限公司 公司简介 德昂信息技术(北京)有限公司&#xff08;以下简称德昂信息&…

谷歌的 Astra 是其首款人工智能代理

谷歌将于今年晚些时候推出一款名为 Astra 的新系统&#xff0c;并承诺它将成为迄今为止推出的最强大、最先进的人工智能助手。 当前一代的人工智能助手&#xff0c;例如 ChatGPT&#xff0c;可以检索信息并提供答案&#xff0c;但仅此而已。但今年&#xff0c;谷歌将其助手重…

力扣HOT100 - 322. 零钱兑换

解题思路&#xff1a; 动态规划 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount 1];Arrays.fill(dp, amount 1);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j) {if (coins[j] < i) …

探索设计模式的魅力:机器学习赋能,引领“去中心化”模式新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;机器学习赋能&#xff0c;引领“去中心化”模式新纪元 ✨欢迎加入…

Linux 生态与工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…