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
我正在尝试创建一个 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