关于树莓派上.py程序(minimalmodbus)的问题

问题描述 投票:0回答:1

我在窗口中运行了下面的 .py 脚本,得到了结果,然后将它们作为 pscp 传递到 Raspberry Pi 来测试执行情况。

import minimalmodbus as minimalmodbus
import serial,time
import serial.tools.list_ports as sp

for i in range(len(sp.comports())):
    desc = sp.comports()[i].description
    if desc.find('USB2.0') != -1:
        port = sp.comports()[i].device
        break
    
if __name__ == '__main__':
    # /dev/ttyUSB0
    instrument = minimalmodbus.Instrument(port, 2)
    instrument.serial.baudrate = 19200  # Baud
    instrument.serial.bytesize = 8
    instrument.serial.parity = serial.PARITY_NONE
    instrument.serial.stopbits = 1
    instrument.address = 2
    instrument.mode = minimalmodbus.MODE_RTU
    instrument.serial.timeout = 1  # seconds
    instrument.clear_buffers_before_each_transaction = True
    # instrument.debug = True
    instrument.precalculate_read_size = True
    
    while True:
        
    # try:
       
        temp1 = instrument.read_register(30033,functioncode=4)
        # temp2 = instrument.read_register(1,functioncode= int('0x04',16))
        print(temp1)
        # print(temp2)
        # time.sleep(10)
        
    
        # temp1 = instrument.read_register(0,functioncode= int('0x04',16))
                    
    # except IOError as e:
    #     print("Failed to read from instrument",e)

重复连续执行的两种情况:

administrator@pi:~ $ python3 modbus_test.py 
0
0
0
0
0
0
0
0
0
Traceback (most recent call last):
  File "/home/administrator/modbus_test.py", line 28, in <module>
    temp1 = instrument.read_register(30033,functioncode=4)
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 484, in read_register
    returnvalue = self._generic_command(
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1276, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1353, in _perform_command
    response_bytes = self._communicate(request_bytes, number_of_bytes_to_read)
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1521, in _communicate
    raise NoResponseError("No communication with the instrument (no answer)")
minimalmodbus.NoResponseError: No communication with the instrument (no answer)

enter image description here

administrator@pi:~ $ python3 modbus_test.py 
0
0
0
Traceback (most recent call last):
  File "/home/administrator/modbus_test.py", line 28, in <module>
    temp1 = instrument.read_register(30033,functioncode=4)
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 484, in read_register
    returnvalue = self._generic_command(
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1276, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1359, in _perform_command
    payload_from_slave = _extract_payload(
  File "/usr/local/lib/python3.9/dist-packages/minimalmodbus.py", line 1904, in _extract_payload
    raise InvalidResponseError(text)
minimalmodbus.InvalidResponseError: Checksum error in rtu mode: b'\xfd\xe4' instead of b'\xfd0' . The response is: b'\x02\x04\x02\x00\x00\xfd\xe4' (plain response: b'\x02\x04\x02\x00\x00\xfd\xe4')

我不知道为什么以前在 Windows 上运行良好的脚本会变成这样。

我怀疑ch340驱动有问题。

我尝试: $lsusb

Bus 001 Device 009: ID 1a86:7523 QinHeng Electronics CH340 serial converter

$lsmod

ch341                  16384  0

$dmesg

[11614.383123] usb 1-1.1.2: Product: USB2.0-Ser!
[11614.386616] ch341 1-1.1.2:1.0: ch341-uart converter detected
[11614.390040] ch341-uart ttyUSB0: break control not supported, using simulated break
[11614.390435] usb 1-1.1.2: ch341-uart converter now attached to ttyUSB0

我还不知道驱动是否安装了。 不过我一开始就确认了这个值是通过modbus输出的。

奇怪的是在windows下 起初,ch340 USB 无法识别。 安装ch340驱动后,USB的描述变为ch340。 它已经改变了。 但Linux使用的是USB2.0-Ser!描述已修复。

因此,ch340驱动是否连接仍然存在疑问。

我想知道。 ch340驱动现在运行正常吗? 如果正在运行,那么运行良好的脚本是否存在问题? 如果不起作用怎么办

raspberry-pi driver python-3.9 minimalmodbus
1个回答
0
投票

我找到了答案。 这是电缆问题,不是编码问题,用Sysbase提供的电缆重新连接(测试)时,确认通讯正常。

© www.soinside.com 2019 - 2024. All rights reserved.