0

よく説明するのは言うまでもなく、これにタイトルを付ける方法がわかりませんが、ここで説明します。

私は現在この方法を持っています:

- (void) receivedData:(NSString *)data {
}

シリアルデータが読み取られたときにトリガーされます。シリアルデータは次のように受信されます:<DMX>255,23,1,4,6</DMX>問題は、1つの統合された文字列として受信されないことです。それはバラバラになります。、、、<DMなどX>255,23,1,4,ランダムなので追跡できません。すべてを送信する場合もあれば、一度に2文字ごとに送信する場合もあります。それが現実さ。

私のコードでは、すべてが入ってくるのを待ってから(で始まり、<DMX>で終わる</DMX>)、NSStringを作成するにはどうすればよいですか?たぶん、データが入ってくると、ピースを保存し、終了を待ってから、</DMX>それらを結合しますか?

ありがとう!

4

1 に答える 1

1
  1. XMLを解析していて、XMLパーサーを使用するオプションがある場合は、それを使用します(iOS / OSXには組み込みのXMLパーサー、およびその他の多数のオプションがあります)。

  2. ただし、代わりにこれをコーディングすることにした場合は...

NSMutableString ivarを作成し、データを受信するときに()を追加し続けappendStringます...次に、開始/終了タグをすでに満たしているかどうかを追跡します...

これらの線に沿った何か..

MyClass.h

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

MyClass.m

-(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];
}
于 2012-12-01T23:39:05.183 に答える