NSString子串问题

时间:2015-04-28 18:25:28

标签: objective-c cocoa nsstring

这是我用来将NSString分成子串的代码。我不明白为什么他们会以他们的方式分开。我曾经有过这样的实例,有些实际上是搞砸了。此方法是来自此project中定义的协议的委托。我觉得它只是端口接收数据的方式和它的时间。我只是想确保我没有错误地使用NSString。

我正在尝试将x,y和z字符串放入同一个数组中。

- (void)serialPort:(ORSSerialPort *)serial didReceiveData:(NSData *)data {
NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSArray *listItems = [temp componentsSeparatedByString:@" "];
NSLog(@"%@", listItems);

输出:

        2015-04-28 14:15:50.522 GroundStation[69301:3573401] (
    X01,
    Y00,
    ""
)
2015-04-28 14:15:50.522 GroundStation[69301:3573401] (
    Z05,
    ""
)
2015-04-28 14:15:53.675 GroundStation[69301:3573401] (
    X01,
    Y00,
    ""
)
2015-04-28 14:15:53.675 GroundStation[69301:3573401] (
    Z04,
    ""
)
2015-04-28 14:15:58.226 GroundStation[69301:3573401] (
    "X-34",
    "Y-1"
)
2015-04-28 14:15:58.228 GroundStation[69301:3573401] (
    4,
    Z38,
    ""
)

1 个答案:

答案 0 :(得分:1)

来自串口的数据是否真的以UTF8编码,或者它只是普通的ASCII或其他东西?

我尝试用这个替换第二行:

NSString *temp = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

从您的问题中我得到的印象是,您不确定串口连接是什么,如果它只是一个二进制协议会怎么样?

编辑:

阅读完评论后,我会以不同的方式做到这一点,每次收到一些NSData时都不要将这些空格分开,因为你的消息可以分成多个部分,有时你只是收到X和Y然后下次调用receiveData时单独使用Z,或者在最后一步中,Y的值甚至会在两个消息中被分解...

您需要存储使用此回调接收的数据,并仅在您有完整消息时处理它,而不是每次都像现在一样进行解析。

你可以做两件事:

  1. 为此邮件保留固定大小,例如大小为12个字符:X123Y123Z123,包括标志。将您收到的内容放在缓冲区中,并在拥有它们时解析这12个字符 。当您解析了三个X,Y,Z组件时,从缓冲区中删除这12个字符并重复。

  2. 添加行终止符(可以是任何字符)。每次收到一些数据时都将其放入缓冲区,并在找到行终止符时解析消息 ,当您解析三个X,Y,Z组件时,从缓冲区中删除该内容并重复