rfcomm0使用PySerial冻结,BluetoothSocket包含50%垃圾 - 缓冲区问题?

时间:2015-04-16 09:25:32

标签: python bluetooth

我正在尝试使用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秒后死亡)。

有什么建议吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好的,把那只野兽钉了下来:

当主机端的rfcomm0缓冲区为空时,整个过程就会死掉。

读取(1)-ing from empty rfcomm0 buffer = deadlock without comeback

解决方案:

  • 很好:看看缓冲区中是否有一些数据 - 如果是,请阅读
  • 丑陋:使用一些time.delay()并希望上帝有一些数据