我对一个需要使用蓝牙 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 干扰而不改变行为。
有什么我在这里想念的吗?我在哪里可以检查错误。任何帮助将不胜感激。