CH579收到蓝牙命令后,调用OTA_IAP_SendData函数,然后调用SYS_ResetExecute,此时手机无法收到蓝牙回复的包

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 );
}

可以在这个函数中去处理。


只有登录才能回复,可以选择微信账号登录