Pymodbus:在 StopServer -> StartSerialServer 后不起作用无法打开端口:PermissionError

问题描述

版本: Python:3.9 | Pymodbus:2.5.1

Pymodbus 特定: 服务器:rtu - 同步/异步 |客户端:rtu - 同步/异步

说明:

在我的应用程序中,我想启动一个 SerialServer,它可以被通过 RTU 连接的客户端读取。客户端读取值后,我想停止服务器。此时用户应该能够自己更改一些值并再次启动 SerialServer。 正是SerialServer的第二次启动不起作用,因为服务器无法打开端口。

from pymodbus.version import version
from pymodbus.server.asynchronous import StartSerialServer,StopServer
from pymodbus.device import Modbusdeviceidentification
from pymodbus.datastore import ModbussparseDataBlock
from pymodbus.datastore import ModbusSlaveContext,ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer

import time
import sys
import threading
from qtpy import QtWidgets

app = QtWidgets.QApplication(sys.argv)

def modbus_server_start():
    print("Modbus-Server start:")

    class CustomDataBlock(ModbussparseDataBlock):
        def setValues(self,address,value):
            super(CustomDataBlock,self).setValues(0,value_1)
            super(CustomDataBlock,self).setValues(1,11)
            super(CustomDataBlock,self).setValues(2,12)

    block = CustomDataBlock({0: [0] * 100})
    store = ModbusSlaveContext(hr=block)
    context = ModbusServerContext(slaves=store)

    identity = Modbusdeviceidentification()
    identity.vendorName = 'pymodbus'
    identity.ProductCode = 'PM'
    identity.vendorUrl = 'http://github.com/riptideio/pymodbus/'
    identity.ProductName = 'pymodbus Server'
    identity.ModelName = 'pymodbus Server'
    identity.MajorMinorRevision = version.short()

    StartSerialServer(context,framer=ModbusRtuFramer,identity=identity,port='COM6',timeout=0.05,baudrate=19200)

def server_start():
    print("Start an async server.")
    t = threading.Thread(target=modbus_server_start)
    t.daemon = True
    t.start()

def modbus_server_stop():
    stopthread = threading.Thread(target=stop)
    stopthread.daemon = True
    stopthread.start()
    print("Server was stopped.")

def stop():
    print("Process will be down.")
    StopServer()  # Stop server.
    sys.exit(0)  # Kill the server code.

window = QtWidgets.QMainWindow()
window.setwindowTitle("StartSerialServer")
window.setGeometry(500,500,400,125)

button = QtWidgets.QPushButton(window)
button.setText("Start")
button.setGeometry(0,60,30)
button.show()
button.clicked.connect(server_start)

button2 = QtWidgets.QPushButton(window)
button2.setText("Stop")
button2.setGeometry(100,30)
button2.show()
button2.clicked.connect(modbus_server_stop)

comboBox = QtWidgets.QComboBox(window)
comboBox.setGeometry(50,40,30)
comboBox.addItem("")
comboBox.addItem("")
comboBox.addItem("")
comboBox.addItem("")
comboBox.addItem("")
comboBox.setItemText(0,"0")
comboBox.setItemText(1,"10")
comboBox.setItemText(2,"20")
comboBox.setItemText(3,"30")
comboBox.setItemText(4,"40")
comboBox.show()
global value_1
value_1 = comboBox.currentText()

window.show()
sys.exit(app.exec_())

错误代码

Start an async server.
Modbus-Server start:
Process will be down.
Server was stopped.

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\python32\lib\threading.py",line 954,in _bootstrap_inner
Start an async server.
Modbus-Server start:
    self.run()
  File "C:\python32\lib\threading.py",line 892,in run
    self._target(*self._args,**self._kwargs)
  File "C:\python32\Projekte\Pymodbus-Test\github_issue.py",line 36,in modbus_server_start
    StartSerialServer(context,baudrate=19200)
  File "C:\python32\Projekte\Pymodbus-Test\venv\lib\site-packages\pymodbus\server\asynchronous.py",line 340,in StartSerialServer
    SerialPort(protocol,port,reactor,baudrate=baudrate,parity=parity,File "C:\python32\Projekte\Pymodbus-Test\venv\lib\site-packages\twisted\internet\_win32serialport.py",line 44,in __init__
    self._serial = self._serialFactory(
  File "C:\python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialwin32.py",line 33,in __init__
    super(Serial,self).__init__(*args,**kwargs)
  File "C:\python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialutil.py",line 244,in __init__
    self.open()
  File "C:\python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialwin32.py",line 64,in open
    raise SerialException("Could not open port {!r}: {!r}".format(self.portstr,ctypes.WinError()))
serial.serialutil.SerialException: Could not open port 'COM6': PermissionError(13,'Zugriff verweigert',None,5)

我想关闭并重新打开服务器,但这也不起作用。

也许有人可以帮我解决这个问题。 :)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...