2010-09-30 78 views
1

我正在開發一個應用程序,它通過UART端口從附件獲取數據。當我的應用程序運行很長時間時,我遇到了問題,它在iPhone進入睡眠模式後使用更多內存,並再次喚醒,在配件完全通過驗證後,我的應用程序無法打開與配件的會話。在調試EAAccessoryManager類之後,我看到兩個相同的設備,它們都是我的附件。轉到設置/常規/關於,我發現iPhone顯示兩個相同的設備。 但我的問題只發生在iPhone 3G(版本iOS 4.1)上,iPhone 3GS(iOS 4.1)沒有這個問題。我猜是因爲我的程序使用了太多的內存,所以我無法獲得accessoryDidDisconnect事件。請給我一些建議。感謝您的回答。外部附件通知:

-(EASession*) openSessionForProtocol: (NSString*)protocolString 
{ 
    NSArray* accessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories]; 

    EAAccessory* accessory = nil; 
    EASession *session = nil; 
    for(EAAccessory* obj in accessories){ 
      if([[obj protocolStrings] containsObject:protocolString]){ 
       accessory = obj; 
       break; 
      } 
    } 
    if(accessory){ 
      [accessory setDelegate:self]; 
      session = [[EASession alloc] initWithAccessory:accessory forProtocol:protocolString]; 
      if(session){ 
       NSString *msg = @""; 
       for(EAAccessory* obj in accessories){ 
        msg = [msg stringByAppendingFormat:@"\n%@",[obj name]]; 
       } 
       NSString *openSession = [NSString stringWithFormat:@"The number of devices is: %d.%@",[accessories count],msg]; 

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"OpenSession" message:openSession delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release]; 
       [[session inputStream] setDelegate:self]; 
       [[session inputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
       [[session inputStream] open]; 
       [[session outputStream] setDelegate:self]; 
       [[session outputStream] scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
       [[session outputStream] open]; 
       [session autorelease]; 
       iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate]; 
       [appDelegate SetApplicationRotation:TRUE]; 
      } 
    } 
    return session; 
} 

- (void)accessoryDidDisconnect:(EAAccessory *)accessory 
{ 
    //[HardwareController performSelectorOnMainThread:@selector(UpdateStringOnMessage:) withObject:@"Can not connect hardware module.\nPlease check hardware again." waitUntilDone:YES]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Accessory is unpluged!" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    [[serialSession inputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
    [[serialSession outputStream] removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 

    [serialSession release]; 
     self.serialSession = nil; 
    iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [delegate setUserCancel:NO]; 
    AllowedEmitSignal = TRUE; 

    [delegate UpdateAboutHardwareDisconnect]; 
    [delegate SetApplicationRotation:FALSE]; 
} 

- (void)accessoryDidConnect:(NSNotification *) notification 
{ 
    iRemoteAppDelegate *appDelegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate setUserCancel:NO]; 
    [self OpenPort]; 
    AllowedEmitSignal = TRUE; 
    [appDelegate UpdateAboutHardwareDisconnect]; 
    appDelegate.CallNumber = appDelegate.CallNumber+1; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:[NSString stringWithFormat:@"Accessory is attached!%d",appDelegate.CallNumber] delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

-(void)OpenPort 
{ 
    int i =0; 
    [self initAllVariable]; 
    iRemoteAppDelegate *delegate = (iRemoteAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    for (;self.serialSession==nil && i<2; i++) { 
      self.serialSession = [self openSessionForProtocol:PROTOCOLSTRING]; 
    } 
} 

回答

0

如果設置/一般/關於顯示iPhone 3G兩個相同的設備,這意味着iPhone 3G無法檢測到附件的「關閉」狀態,當它睡覺。您必須確保附件在iPhone 3G睡眠時也進入睡眠狀態(低功耗狀態),在您的附件從3G接收字節後幾毫秒內即告知它正在更改其電源狀態。

這裏不能講太多的祕密。但從我的經驗來看,iPhone 3G與3GS有着許多不同的電信號行爲。您的問題與iOS應用代碼無關。我強烈建議您在即將進入睡眠之前使用CRO/Logic Analyzer來調試從iPhone 3G發送的檢測引腳狀態和命令。