python通过modbus_tk库进行异步串口通讯出错

错误提示:

PS D:\OwnPython> & C:/Python311/python.exe d:/OwnPython/ceshi2.py
Traceback (most recent call last):
  File "d:\OwnPython\ceshi2.py", line 3, in <module>
    from modbus_tk import modbus_async
ImportError: cannot import name 'modbus_async' from 'modbus_tk' (C:\Python311\Lib\site-packages\modbus_tk\__init__.py)
PS D:\OwnPython> 

代码部分:


import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
from modbus_tk import modbus_async


# 创建 ModbusRTU 从站实例
server = modbus_rtu.RtuServer(
    'COM2', baudrate=9600, databits=8, parity='N', stopbits=1)
server.start()

# 创建异步客户端实例
client = modbus_async.ModbusAsyncClient(server, timeout_in_sec=5.0)

# 执行读取寄存器操作
result = client.read_holding_registers(
    slave_id=1, starting_address=0, quantity_of_x=10)
if result:
    print(result)
else:
    print("读取寄存器失败")

# 关闭客户端和服务端
client.close()
server.stop()

这个错误是由于在modbus_tk库中找不到名为'modbus_async'的模块导致的。
检查版本是否一致、模块是否不存在等。

第二个
from modbus_tk import modbus_async
改成
from modbus_tk.modbus_async import ModbusAsyncClient 试一下

你用的是比较新的版本的modbus_tk库吧? 在新版本中已经移除了modbus_async模块。你可以更新你的代码再用最新的库版本,或者安装个老版本。

新版本里面如果你要进行异步通信,你还可以考虑试一下用asyncio库结合pymodbus库看能能实现。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

【相关推荐】



  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7551533
  • 这篇博客你也可以参考下:python库modbus_tk的一些解析用法
  • 除此之外, 这篇博客: python 基于modbus_tk库实现modbusTCP 主站和从站[非常详细]中的 从站记录的数据格式 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    timestamplonlatcog
    1651924800108.603096720.57094167169.9
    1651925400108.606122720.56535943170.7
    1651926000108.609148720.5597772171.7
    1651926600108.612174620.55419496143.8
    1651927200108.615200620.54861273203.8
    1651927800108.618226620.5430305207.8
    1651928400108.621252620.53744826181.4
    1651929000108.624278620.53186603180.6
    1651929600108.627304620.52628379179.2
    1651930200108.630330620.52070156172.9
    1651930800108.633356620.51511933172.6
    1651931400108.636382620.50953709173

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

ImportError: cannot import name 'modbus_async' from 'modbus_tk' (C:\Python311\Lib\site-packages\modbus_tk_init.py)
ImportError:无法从“modbus_tk”导入名称“modbus_async”(C:\Python311\Lib\site packages\modbus_tk_init
.py)

根据中文报错含义,分析是因为无法从 modbus_tk 库中导入名为 'modbus_async' 的模块。
这可能是因为 modbus_tk 库的版本不兼容

建议:
1、重新安装低版本,使用以下命令:

pip uninstall modbus_tk  
pip install modbus_tk

进里面看看这个类在哪儿。

给你个参考

import asyncio
from pymodbus.client.asynchronous.serial import AsyncModbusSerialClient
from pymodbus.client.asynchronous import schedulers

# 创建异步串口客户端
client = AsyncModbusSerialClient(
    method='rtu',
    port='COM2',
    baudrate=9600,
    bytesize=8,
    parity='N',
    stopbits=1,
    timeout=1
)

# 定义异步读取寄存器的函数
async def read_registers():
    result = await client.read_holding_registers(
        unit=1,
        address=0,
        count=10
    )
    if result.isError():
        print("读取寄存器失败")
    else:
        print(result.registers)

# 异步执行读取寄存器操作
async def main():
    await client.connect()
    await read_registers()
    await client.close()

# 运行异步事件循环
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

这个问题可能是由于modbus_tk版本的问题导致的。您可以尝试更新到最新版本,使用以下命令升级modbus_tk:

pip install --upgrade modbus-tk

如果升级后仍然有问题,请检查您的代码,确保正确导入模块,示例如下:

from modbus_tk import modbus_tcp

python实现modbus通讯-modbus_tk
可以参考下


利用Python(pyserial、minimalmodbus、modbus_tk)进行单片机通信_yt16210的博客-CSDN博客 这里写自定义目录标题pyserial欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入背景最近利用Python语言设计串口和单片机进行通信的程序,现总结pyserial、minim_minimalmodbus https://blog.csdn.net/yt16210/article/details/109361754

https://pypi.org/project/async-modbus/

参考结合AI智能、文心一言等综合回答,若有帮助,恭请采纳。

在使用modbus_tk库进行异步串口通讯时,出现错误可能是由于以下一些原因造成的:

  1. 串口配置错误:检查串口的波特率、数据位、停止位、奇偶校验是否设置正确。

  2. 硬件连接错误:检查串口的连接是否牢固,是否存在松动等问题。

  3. 库使用错误:确保正确导入modbus_tk库,并正确调用相关函数。

  4. 异常处理问题:在进行读写操作时,应注意异常的处理,避免程序崩溃或出现未知错误。

  5. 系统权限问题:在某些情况下,可能需要以管理员身份运行程序,或者给程序赋予足够的权限来进行串口通讯操作。

您可以针对以上几个方面进行排查,找到具体的错误原因并进行修复。如果仍然无法解决问题,可以提供更详细的错误信息或代码片段,以便更好地进行指导。

错误提示,表示无法从 'modbus_tk' 模块导入 'modbus_async'。这可能是由于以下原因:
'modbus_tk' 模块或其依赖项未正确安装。
'modbus_tk' 模块的 'modbus_async' 部分在当前的 Python 环境中不可用或不可访问。

参考gpt
根据您提供的错误提示,看起来是无法从modbus_tk库中导入modbus_async模块。这可能是由于库版本不兼容或者模块名称发生了变化。

请确认您正在使用的modbus_tk库的版本是否支持modbus_async模块。您可以尝试更新或降级modbus_tk库来解决版本兼容性问题。您可以使用以下命令来安装特定版本的modbus_tk库:

pip install modbus_tk==1.1.1

如果仍然无法导入modbus_async模块,您可以查看modbus_tk库的文档或者官方源代码来确认模块的名称是否发生了变化。有时候库的更新可能会导致模块名称的变化,您需要根据最新的文档或源代码进行相应的修改。

找不到引入的模块

请确保你已经正确安装了 modbus_tk 库,并且该库的版本支持 modbus_async 模块,你可以尝试升级或重新安装 modbus_tk 库来解决该问题

参考gpt:
结合自己分析给你如下建议:
modbus_tk库没有modbus_async模块,而是有modbus_rtu_async和modbus_tcp_async模块。这两个模块分别用于异步的RTU和TCP通讯。如果你想使用异步的串口通讯,你应该导入modbus_rtu_async模块,而不是modbus_async模块。你可以尝试修改你的代码如下:

import modbus_tk.defines as cst from modbus_tk import modbus_rtu from modbus_tk import modbus_rtu_async # 修改这一行

创建 ModbusRTU 从站实例
server = modbus_rtu.RtuServer( ‘COM2’, baudrate=9600, databits=8, parity=‘N’, stopbits=1) server.start()

创建异步客户端实例
client = modbus_rtu_async.ModbusAsyncClient(server, timeout_in_sec=5.0) # 修改这一行
执行读取寄存器操作
result = client.read_holding_registers( slave_id=1, starting_address=0, quantity_of_x=10) if result: print(result) else: print(“读取寄存器失败”)
关闭客户端和服务端
client.close() server.stop()

引用 皆我百晓生 小程序回复内容作答:

根据错误提示,无法从modbus_tk中引入名为modbus_async的模块。可能是因为你的modbus_tk库中没有这个模块或者版本不兼容。

解决方法:

  1. 检查你的modbus_tk库的版本,确保是最新的版本。可以使用pip show modbus_tk命令查看当前安装的版本。
  2. 如果你的版本太旧,可以尝试升级到最新版本。可以使用pip install --upgrade modbus-tk命令来升级。
  3. 如果升级后仍然无法解决问题,可能这个模块已经被删除或重命名了。你可以在官方文档或仓库中查找最新的使用方式。
  4. 如果官方文档或仓库中没有找到相关信息,你可以尝试使用其他类似的库来代替modbus_tk。

希望以上解决方法对你有帮助!

结合GPT给出回答如下请题主参考
根据提供的信息,无法确定具体的错误类型或错误提示。建议提供更多详细信息,例如完整的错误提示信息、代码片段等,以便更好地理解问题并提供解决方案。

同时,针对modbus_tk库进行串口通讯的问题,建议参考官方文档或相关资料,确保代码正确,例如正确配置串口参数、使用正确的寄存器地址等。