CH579收到蓝牙命令后,调用OTA_IAP_SendData函数,然后调用SYS_ResetExecute,此时手机无法收到蓝牙回复的包,ch579先重启了。如果在回调函数OTA_IAPReadDataComplete里再调用SYS_ResetExecute,还是无法确保ch579已经发送蓝牙结束,依然是ch579重启被先执行了,请问如何才能确保ch579已经发送蓝牙包成功了,然后再重启ch579?
你好,在使用backup备份方式进行升级时,是不需要进行调用复位的,因为额外有一套蓝牙的服务进行接收待升级的数据了。
如果需要自行管理,在发送完成之后会有回调函数OTA Send Comp的打印,可以根据它进行观察发送数据完成。
现在我们在这个用例里增加了一个私有命令,手机发送命令给ch579,让ch579保存这个命令, ch579收到命令后,发送1个字节的返回值例如OTA_IAP_SendCMDDealSta(0x00);,然后需要重启调用SYS_ResetExecute,此时手机一直无法收到ch579发送的字节,就重启了。我再OTA_IAPReadDataComplete函数里再调用SYS_ResetExecute()函数,也还是无法把这个字节0x00正常发送出来,因为手机一直收不到这个命令。但是如果我不调用SYS_ResetExecute()函数,其他代码不动,手机是可以收到0x00这个返回值的。
你好,请问代码里如何确保ch579已经通过蓝牙发送数据成功了?我们希望发送数据成功后,调用SYS_ResetExecute()重启MCU。
您好,OTA_IAP_SendCMDDealSta(0x00);这边是实现的功能是将数据放到一个数据等待主机去读,OTA_IAPReadDataComplete是数组内容产生变化的回调,所以需要等主机读完才可以复位的,主机发起读,程序会进入
static bStatus_t OTAProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, uint8 *pValue, uint16 *pLen, uint16 offset, uint16 maxLen,uint8 method ) { bStatus_t status = SUCCESS; if ( pAttr->type.len == ATT_BT_UUID_SIZE ) { // 16-bit UUID uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); switch ( uuid ) { case OTAPROFILE_CHAR_UUID: { *pLen = 0; if( OTAProfileReadLen ) { *pLen = OTAProfileReadLen; tmos_memcpy( pValue, OTAProfileReadBuf, OTAProfileReadLen ); OTAProfileReadLen = 0; if( OTAProfile_AppCBs && OTAProfile_AppCBs->pfnOTAProfileRead ) { OTAProfile_AppCBs->pfnOTAProfileRead(OTAPROFILE_CHAR); } } break; } default: { // Should never get here! (characteristics 3 and 4 do not have read permissions) *pLen = 0; status = ATT_ERR_ATTR_NOT_FOUND; break; } } } else { // 128-bit UUID *pLen = 0; status = ATT_ERR_INVALID_HANDLE; } return ( status ); }
可以在这个函数中去处理。