1

我对一个需要使用蓝牙 LE 将固件文件从 Android 设备发送到 STM32F4 芯片的项目感到疯狂。

我已经成功地在两端实现了 BLE,并且我在很长一段时间内都在使用它,并且没有任何问题。

现在应该实现一个文件传输,它应该能够发送大约 250K 大小的文件。我的实现似乎有效,但仅适用于 10 种情况之一。它确实开始以 20 字节的块发送数据包,但随后在未确定的点上停止了 90% 的测试用例中的通信。我需要断开/重置并重新启动以重新启动。

STM32F4 上文件传输器的特性定义为:

 ret = aci_gatt_add_char(fileServiceHandle,
                            UUID_TYPE_128,                      // File xfer  UUID 
                            uuid,                               // Char UUID
                            FILEIO_RECORD_LEN,                  // Maximum length of the characteristic value (20)
                            CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RESP|CHAR_PROP_NOTIFY,   // WRITE NOTIFY me
                            ATTR_PERMISSION_NONE,               // Nothing special
                            GATT_NOTIFY_ATTRIBUTE_WRITE,        // The application will be notified when a client writes to this attribute.
                                                                // An @ref EVT_BLUE_GATT_ATTRIBUTE_MODIFIED will be issued.
                            16,                                 // Encryption key size
                            0,                                  // is fixed length (1== variable size)
                            &fileRequestHandle);                // ReturnValue als handle

在 Andoid 中,我将服务特征中的 WRITE_TYPE_NO_RESPONSE 标志设置为

public void onServicesDiscovered(BluetoothGatt gatt, int status) {
   ... aServiceCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);

对于最多 8 个数据包的 FIFO,写入数据包在 onCharacteristicWrite 回调函数中完成。

  • 最多构建 8 个文件数据片段并将其排队到 fifo

  • wrtCharacteristic.setValue(firstQueueItem);

  • 在 onCharacteristicWrite 回调中:if queue not empy { wrtCharacteristic.setValue(nextQueueItem);}

  • 如果在 STM32F4 中接收到最后一个数据包,则该组中的所有数据包都经过验证,并发送回确认,从而在 APP 中引发事件。然后该事件触发发送接下来的 8 个数据包。

这对我来说看起来很简单,有时似乎有效。如果我将连续块的数量设置为 1,它总是可以工作。几乎所有其他大小的文件都不能完成发送 in 文件。

没有证据表明传输何时中断,有时是立即中断,有时是在发送超过 80% 的数据之后。

我还尝试跳过将 STM32F4 上接收到的数据写入闪存,以避免 SPI 干扰而不改变行为。

有什么我在这里想念的吗?我在哪里可以检查错误。任何帮助将不胜感激。

4

1 回答 1

0

由于未知原因,此问题不再发生。与我在上面所说的相比,我的实现没有改变。我试图为每组的最后一个数据包请求 BLE 响应,但这似乎没有任何区别。

我感谢所有阅读和评论这篇文章的人。

于 2017-07-27T17:44:35.597 回答