连接不完全字符串Objective-c

连接不完全字符串Objective-c,objective-c,string,serial-port,Objective C,String,Serial Port,我不知道该如何命名,更不用说解释清楚了,但它就在这里 我目前有以下方法: - (void) receivedData:(NSString *)data { } 它在读取串行数据时触发。串行数据的输入形式为:255,23,1,4,6问题是,它不是作为一个统一的字符串输入的。它是零碎的。比如,255,,23,1,4,,等等。它是随机的,所以我无法跟踪它。有时它发送整个东西,另一些则一次发送两个字符。事实就是这样 在我的代码中,我如何才能等待整个事件进入(从开始,到结束),然后创建一个NSStrin

我不知道该如何命名,更不用说解释清楚了,但它就在这里

我目前有以下方法:

- (void) receivedData:(NSString *)data {
}
它在读取串行数据时触发。串行数据的输入形式为:
255,23,1,4,6
问题是,它不是作为一个统一的字符串输入的。它是零碎的。比如,
255
,23,1,4,
,等等。它是随机的,所以我无法跟踪它。有时它发送整个东西,另一些则一次发送两个字符。事实就是这样

在我的代码中,我如何才能等待整个事件进入(从
开始,到
结束),然后创建一个NSString?也许当数据输入时,存储片段,等待结束,然后将它们组合在一起

谢谢

  • 如果您正在解析XML,并且可以选择使用XML解析器,请使用它(iOS/OSX中有内置的XML解析器,以及许多其他选项)

  • 但是,如果您决定将此代码改为

  • 创建
    NSMutableString
    ivar,并在接收数据时不断向其添加(
    appendString
    )。。。 然后跟踪您是否已经满足开始/结束标记

    类似这样的东西

    MyClass.h
    中:

    @interface Myclass : NSObject
    {
        NSMutableString *buffer, *tmpBuffer;
        int status; // 0=waiting for <DMX>, 1=recording, 2=done
    }
    

    如何在“”传入时开始,在“”传入时结束?嗯。。这将更加困难,但请稍等几分钟;)非常感谢你,庞查:)我想再加一句,有时候它不会是完整的“”或“”。它可能以“”或“”的形式出现。很不幸是随机的。OSX?在ios NSXMLParser上,NSXMLDocument比这个自制的东西要简单得多:)@poncha并不是说您的代码是错误的,我同意,如果您可以选择使用XML解析器,那么这始终是首选方法。。。我的意思是,您将如何使用
    DMX injection;)]]>
    -(id) init {
      if(self = [super init]) {
        buffer = [[NSMutableString alloc] init];
        tmpBuffer = [[NSMutableString alloc] init];
        status = 0;
      }
      return self;
    }
    
    -(void) receivedData:(NSString *)data {
      if(status == 2) return; // already done
    
      // status=0 means we are still looking for start tag
      if(status == 0) {
        // add new data to last examined chunk (if any)
        [tmpBuffer appendString:data];
    
        // try to locate the open tag inside the tmpBuffer
        NSRange range = [tmpBuffer rangeForString:@"<DMX>" options:NSCaseInsensitiveSearch];
    
        // if found, store the portion after the start tag into buffer
        if(range.location != NSNotFound) {
          range.length = [tmpBuffer length] - range.location + 5; // 5 is length of start tag...
          [buffer setString:[tmpBuffer substringWithRange:range]];
          status = 1; // set status to 1 so we know recording started
        } else {
          // store last examined chunk
          [tmpBuffer setString:data];
        }
      }
      else {
        [buffer appendString:data];
        NSRange range = [buffer rangeForString:@"</DMX>" options:NSCaseInsensitiveSearch];
        if(range.location != NSNotFound) {
          range.length = [buffer length] - range.location;
          [buffer deleteCharactersInRange:range];
          status = 2;
        }
      }
    }
    
    -(void) dealloc {
      [buffer release];
      [tmpBuffer release];
      [super dealloc];
    }