我正在尝试使用pyserial通过rfcomm0读取一些蓝牙传感器数据。
使用linux rfcomm命令及其rfcomm.conf设置连接工作正常。但是在使用pyserial进行读取尝试后,设备在几秒钟后就会冻结(直到那个poing提供正确的数据!)并且仅在完成设备重置后才可用。使用与FTDI级别移位器的直接连接,我的代码工作正常,没有问题。
rfcomm.conf:
rfcomm0 {
Automatically bind the device at startup
bind no;
device 98:D3:31:70:23:90;
channel 1;
comment "Example Bluetooth device";
}
用于设置连接的命令
# rfcomm -i hci0 connect 0
Connected /dev/rfcomm0 to 98:D3:31:70:23:90 on channel 1
相关的python代码片段(使用魔术算法大量循环读取(1)-ing bytes):
ser = serial.Serial('/dev/rfcomm0')
start_frame = ser.read(1)
(...)
死锁时的Python跟踪:
serialposix.py(443): if not self._isOpen: raise portNotOpenError
serialposix.py(444): read = bytearray()
serialposix.py(445): while len(read) < size:
serialposix.py(446): ready,_,_ = select.select([self.fd],[],[], self._timeout)
似乎linux主机蓝牙设备停止提供数据。当我将FTDI直接连接到蓝牙传感器时,它仍在发送数据。
为什么这样做?!我是否需要冲洗一些神奇的蓝牙缓冲区?我甚至尝试了两种不同的蓝牙适配器。
在SF上我找到了这篇文章:
https://askubuntu.com/questions/114171/why-is-dev-rfcomm0-giving-pyserial-problems
但是使用BluetoothSocket并将read(1)替换为recv(1),只有50%的接收数据是正确的,其余的包含垃圾(上层解决方案给我100%的数据但在~5秒后死亡)。
有什么建议吗?
感谢您的帮助!
答案 0 :(得分:0)
好的,把那只野兽钉了下来:
当主机端的rfcomm0缓冲区为空时,整个过程就会死掉。
读取(1)-ing from empty rfcomm0 buffer = deadlock without comeback
解决方案: