这是我用来将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,
""
)
答案 0 :(得分:1)
来自串口的数据是否真的以UTF8编码,或者它只是普通的ASCII或其他东西?
我尝试用这个替换第二行:
NSString *temp = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
从您的问题中我得到的印象是,您不确定串口连接是什么,如果它只是一个二进制协议会怎么样?
编辑:
阅读完评论后,我会以不同的方式做到这一点,每次收到一些NSData时都不要将这些空格分开,因为你的消息可以分成多个部分,有时你只是收到X和Y然后下次调用receiveData时单独使用Z,或者在最后一步中,Y的值甚至会在两个消息中被分解...
您需要存储使用此回调接收的数据,并仅在您有完整消息时处理它,而不是每次都像现在一样进行解析。
你可以做两件事:
为此邮件保留固定大小,例如大小为12个字符:X123Y123Z123,包括标志。将您收到的内容放在缓冲区中,并在拥有它们时解析这12个字符 。当您解析了三个X,Y,Z组件时,从缓冲区中删除这12个字符并重复。
添加行终止符(可以是任何字符)。每次收到一些数据时都将其放入缓冲区,并在找到行终止符时解析消息 ,当您解析三个X,Y,Z组件时,从缓冲区中删除该内容并重复