3

我目前正在尝试从 Python 3 向 Arduino(使用 HC-06)发送消息。我已设法建立连接,但似乎找不到发送消息的正确方法。

这是我用来设置连接的代码(我使用 PyBluez 进行蓝牙):

import sys
import bluetooth

bd_addr = '[MAC-address for HC-06]'
port = 1
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr,port))

发送我正在尝试:

sock.send("2")

引发错误:“TypeError:期望字节缓冲区,得到str”。

也试过:

sock.send(str('2'))

它还会引发错误:“TypeError: Expecting byte-buffer, got str”。

我试过很多其他的,比如“sock.send(2)”、“sock.send(b'2')”、bytearray、“sock.send(bytes(["2"]))”。基本上,我尝试发送的任何数据类型都需要另一个。

我已经设法通过我的 Android 手机上的蓝牙终端发送了我所有的命令(目前只有 1 个和 2 个),所以在 Arduino 网站上没有问题。

那里有很多指南,其中包含我无法复制的示例。谁能告诉我如何发送基本命令?我什至接近答案吗?

编辑: 我现在尝试了“sock.send("2".encode())”,它也抛出了一个错误:“TypeError: data must be string, was class 'bytes'”

使用另一个 ide 为我提供了有关错误的更具体信息:

袜子.发送(“2”): 警告(来自警告模块):文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,行737 Foundation.NSData.alloc().initWithBytes_length_(data, len(data)), UninitializedDeallocWarning: 泄漏 _NSPlaceholderData Traceback 类型的未初始化对象(最近一次调用最后):文件“”,第 1 行,在 sock.send("2 ") 文件 "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/bluetooth/osx.py",第 122 行,在发送返回self._sock.send(数据)文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 524 行,在发送结果 = self.__conn.write(writebuf[:sendbytecount]) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 737 行,写入Foundation.NSData.alloc().initWithBytes_length_(data, len(data)), TypeError: Expecting byte-buffer, got str

sock.send("2".encode()): Traceback (最近一次调用最后): 文件 "", 第 1 行, 在 sock.send("2".encode()) 文件 "/Library/Frameworks/Python. framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/bluetooth/osx.py”,第 122 行,在发送返回 self._sock.send(data) 文件“/ Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 487 行,在发送中引发 TypeError(“数据必须是字符串,是 %s" % type(data)) TypeError: data must be string, was class 'bytes'

我开始怀疑图书馆了。在安装 PyBluez 时,我完全有可能做错了什么。我要看看它是否可以在我的 Raspberry Pi 3 上运行。

4

1 回答 1

3

解决方案

当您通过套接字发送数据时,您必须对其进行编码,否则它会引发字节缓冲区错误。当您通过套接字发送数据时,只需使用。

sock.send("2".encode())
于 2017-08-08T20:46:09.007 回答