Python 蓝牙 MODBUS RTU

Python Bluetooth MODBUS RTU

我正在尝试创建一个 python 应用程序,它能够通过蓝牙与我的 DPS3005 电源模块进行通信。我找到了 this GitHub 存储库,它实现了我想做的事情,但是它使用了现在已弃用的 rfcomm connect rfcomm0 XX:XX:XX:XX:XX:XX 命令。

我相信我应该能够在 python 中使用蓝牙套接字实现相同的功能并编写了以下代码:

# ------------------------------ Imports modules ----------------------------- #
import bluetooth
import time
import struct

# ----------------------------- Program Constants ---------------------------- #
DEVICE_ADDRESS = "98:DA:20:01:13:09"
DEVICE_PORT = 1

# ------------------------ Connect to bluetooth device ----------------------- #
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((DEVICE_ADDRESS,DEVICE_PORT))
print("Connected to device!")

time.sleep(0.005)

# ------------------------ Attempt to send data packet ----------------------- #
# Set voltage to 21v
req = struct.pack('10B',
                    0x01, #Start Bit
                    0x01, #Slave Address
                    0x06, #Function Code (0x06 = Write Single Register)
                    0x00, 0x00, #Register Address (0x0000 = Voltage Set Register)
                    0x08, 0x34, #Register Value (0x0834 = 21.00v)
                    0xFB, 0xB2, #CRC Checksum values
                    0x01 #End Bit
                    )

print("TX: (%s)" % req)

sock.send(req)
print("Data Sent!")

# ----------------------------- Close connection ----------------------------- #
sock.close()

我使用了制造商提供的 this 文档来尝试了解我需要如何构建发送给设备的消息,但它似乎不理解我的请求。

我对以这种低级方式进行通信很陌生,我想问一下这种传输是否符合下图所示的 MODBUS RTU 规范,特别是起始位和停止位应该是什么。

上述规范文件的剪报:

非常感谢您的任何建议和帮助!

非常感谢'Brits'您的评论。我设法使用我编写的这个子例程让我的软件工作,以根据提供的规范计算 CRC 值。

# ----------------------- Calculate the CRC Check Value ---------------------- #
def calcCRC(data):
    register = 0xFFFF

    for byte in data:
        register ^= byte
        for i in range(8):
            lsb = register & 1
            register = register >> 1
            if lsb:
                register ^= 0xA001
        
    return register & 0xff, register >> 8 #Return the higher and lower bytes