ValueError: "port" must be None or a string, not <class 'serial.serialwin32.Serial'>
时间: 2024-02-16 09:05:12 浏览: 37
这个错误通常是由于 PyModbus 的 `StartTcpServer` 或 `StartSerialServer` 函数中的 `port` 参数类型不正确导致的。根据您的错误信息,似乎您在配置从站时使用了 Windows 系统下的 `serial` 库,因此可能需要对代码稍作调整。
在 Windows 系统下,串口的配置方式与 Linux 或其他类 Unix 系统下略有不同,因此需要使用 `pymodbus.client.sync.ModbusSerialClient` 类来代替 `serial.Serial` 实例。修改后的代码如下:
```python
from pymodbus.server.sync import StartTcpServer
from pymodbus.server.sync import StartSerialServer
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer
from pymodbus.client.sync import ModbusSerialClient
import logging
# 配置日志记录
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
# 配置串口
serial_port = ModbusSerialClient(method='rtu', port='COM1', baudrate=9600, timeout=0.5)
# 配置从站
slave_id = 1
block_size = 100 # 修改为需要读取的数据块大小
data = ModbusSequentialDataBlock(0, [0] * block_size)
context = ModbusSlaveContext(slaves={slave_id: data})
context_store = ModbusServerContext(slaves=context, single=False)
# 启动 Modbus 从站
StartSerialServer(context_store, framer=ModbusRtuFramer, port=serial_port, timeout=1)
```
在这段代码中,我们使用 `ModbusSerialClient` 类来初始化了一个 Windows 系统下的串口对象,并将其传递给了 `StartSerialServer` 函数的 `port` 参数。这样就可以正确启动一个基于串口的 Modbus 从站了。