首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python蓝牙MODBUS RTU

Python蓝牙MODBUS RTU
EN

Stack Overflow用户
提问于 2022-02-14 17:08:12
回答 1查看 234关注 0票数 1

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

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

代码语言:javascript
复制
# ------------------------------ 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规范,特别是什么是启动和停止位。

上述规格文件的剪报:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 10:21:53

非常感谢‘英国人’的评论。我设法使我的软件工作使用这个子程序,我写了一个CRC值根据提供的规范计算。

代码语言:javascript
复制
# ----------------------- 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71115594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档