我正在尝试创建一个python应用程序,它能够通过蓝牙与我的DPS3005电源模块进行通信。我找到了这 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()我使用制造商提供的这文档来尝试并理解我需要如何构造到设备上的消息,但是它似乎不理解我的请求。
我是非常新的工作,以这种低水平的通信方式,我想问,这样的传输是否符合下面所示的MODBUS RTU规范,特别是什么是启动和停止位。
上述规格文件的剪报:

和

非常感谢您的建议和帮助!
发布于 2022-02-15 10:21:53
非常感谢‘英国人’的评论。我设法使我的软件工作使用这个子程序,我写了一个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 byteshttps://stackoverflow.com/questions/71115594
复制相似问题