Code: Select all
import serial
import time
import crcmod.predefined
# Function to calculate Modbus RTU CRC
def calculate_rs_485_crc(message):
crc16 = crcmod.predefined.mkCrcFun("modbus")
return crc16(message)
port = "/dev/ttyS0"
baudrate = 115200
timeout = 1
ser = serial.Serial(
port,
baudrate,
timeout=timeout,
parity=serial.PARITY_NONE,
)
# Construct Modbus RTU command
message = "020100060001"
command = bytes.fromhex(message)
crc = calculate_rs_485_crc(command)
command_with_crc = command + crc.to_bytes(2, "little")
print(f"Sent: {command_with_crc.hex()}")
ser.write(command_with_crc)
byteData = ser.read_until(b"\xcc")
print(f"byteData: {byteData}")
ser.close()
< /code>
Ich habe Baudrate und den Port überprüft, sie sind in Ordnung. Was auch immer ich mir vorstellen, das Ergebnis ist das gleiche. Ich habe versucht, eine Zeit zu setzen. Wenn ich zumindest keine Schlafzeit habe, erhalten Sie einige Teile der Nachricht. < /P>
Dies ist mein Terminal, an dem ich sehe, was gedruckt wird. Manchmal empfangen Sie das Ende der Nachricht (CRC -Bytes):
Sent: 0201000600011df8< /code>
byteData: b'Q\xcc'
Und manchmal kann ich die tatsächlich erwartete Nachricht sehen. Oder manchmal auch etwas dazwischen.
Code: Select all
Sent: 0201000600011df8< /code>
byteData: b'\x02\x01\x01\x00Q\xcc'
Außerdem können Sie mich im Code verwenden Anzahl der Bytes, die ich zu lesen erwarte, aber nichts davon hat geholfen. Gleiches Ergebnis. Ich bin mir nicht sicher, warum diese Inkonsistenz geschieht. Die meisten meiner Online -Lese -Online -Probleme zeigen Zeitprobleme oder Hardwareprobleme, aber es sind definitiv keine Hardwareprobleme, da ich einige andere Tools verwendet habe, die vom Hersteller bereitgestellt werden, um mit diesem Gerät zu sprechen, und es hat gut funktioniert. Wenn es sich um ein Timing -Problem handelt, verstehe ich nicht, wie es so ist, denn wenn ich etwas Zeit in den Schlafen stelle, um sicherzustellen, dass jedes Stück der Nachricht angekommen ist, bekomme ich nichts. < /P>
Ich hoffe, Sie können mir helfen.
Code: Select all
user@localhost:~$ sudo mbpoll -m rtu -b 115200 -d 8 -s 1 -p none /dev/ttyS0 -a 2 -r 1 -1 -t 0
mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.
Protocol configuration: Modbus RTU
Slave configuration...: address = [2]
start reference = 1, count = 1
Communication.........: /dev/ttyS0, 115200-8E1
t/o 1.00 s, poll rate 1000 ms
Data type.............: discrete output (coil)
-- Polling slave 2...
Read discrete output (coil) failed: Connection timed out