大家好,我使用的开发板是“STM32WB55 Nucleo”开发板,想实现一次性发送和接收超过100个字节的数据包(数据包字节数越多越好,如果能达到250个字节就最好了)。蓝牙底层数据包默认大小大概是20字节。蓝牙协议提到的包格式中的PDU大小为2~257字节。 软件库:STM32Cube_FW_WB_V1.7.0, 使用例程:BLE_p2pServer。 该例程主要是实现蓝牙控制LED1的亮灭。蓝牙调试助手发送0x00 0x01 --> LED1亮,0x00 0x00-->LED1灭。 但是不能接收超过2个字节的数据,蓝牙调试助手发送时显示“成功写入”,但是没有触发P2PS_STM_App_Notification()函数中的事件P2PS_STM_WRITE_EVT
我还发现程序运行一段时间(大概5分钟),就提示“Fatal error:ST-Link USB communication error, Session abort!”,我调试的其他的STM32单片机很少出现过ST Link断开连接的问题。 |
如果没办法,只能长数据包分拆为多包处理 之前用CAN总线传输就是这样,标准CAN总线(不算FD-CAN能到64字节每包)每包最多8个字节 设备上报MCU的(准确来说是STM32的)UID序列号,只能分拆为3包传 接收设备端再按照协议拼包,注意丢了其中1包或者包顺序错乱的容错处理 协议中必须包含一共多少包、当前是第几包、拼包后完整性校验信息
如果没办法,只能长数据包分拆为多包处理 之前用CAN总线传输就是这样,标准CAN总线(不算FD-CAN能到64字节 ...
谢谢您的回复。 如果分包的话,不足之处就是接收到的数据包之间的间隔是不定的。有时候是1ms,有时候会达到30ms以上了。CAN的多个数据包之间的延时小于5ms,能很好判断数据帧的成帧时间。 实际使用过程中,数据包大小在100到250字节之间。如果能不分包的话,那传输的效率就有了很大的提升,大大减小了软件设计的复杂性了。
单次接收应该不能超过247bytes,参考如下结构体, 从AN5270 Table 365. ACI_GATT_READ_EXT_EVENT event parameters,可以读取超过247Bytes,但是数据可能通过多个ACI_GATT_READ_EXT_EVENT上报,是否有更多数据,需通过offset的bit 15来判断。 可以参考下面的例程 C:\Users\min du\STM32Cube\Repository\STM32Cube_FW_WB_V1.7.0\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BLE_DataThroughput
STM32Cube_FW_WB_V1.7.0\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BLE_DataThroughput: 使用该例程,手机端蓝牙助手不能发现“DT_SERVER” STM32Cube_FW_WB_V1.3.0\Projects\P-NUCLEO-WB55.Nucleo\Applications\BLE\BLE_DataThroughput: 使用该例程,手机端蓝牙助手可以发现“DT_SERVER”。 按下开发板上的SW1键后,设备一直发送数据。直到再次按下SW1键后停止发送,SendData()--》DTS_STM_UpdateChar()返回BLE_STATUS_SUCCESS后一直请求发送,UTIL_SEQ_SetTask(1 << CFG_TASK_DATA_TRANSFER_UPDATE_ID, CFG_SCH_PRIO_0);。 但是请求发送的字节数为240字节。DataTransferServerContext.TxData.Length = DATA_NOTIFICATION_MAX_PACKET_SIZE; (240) 发送流程如下: SendData()-》DTS_STM_UpdateChar()-》TX_Update_Char()--》 ret = aci_gatt_update_char_value( aDataTransferContext.DataTransferSvcHdle, aDataTransferContext.DataTransferTxCharHdle, 0, /* charValOffset */ pDataValue->Length, /* charValueLen */ 这里的Length=240,调试时确定。 (uint8_t *) pDataValue->pPayload);