从我的Arduino,我写的多字节数据与Serial.print(“嗒嗒”)系列,但在Objective-C, -serialPort:didReceiveData:
由ORSSerialPort提供)一次只能得到这个数据1个字节。 有时,它会在一次抢2个字节,但从未所有4.这个预期? 如果是这样,我怎么可以把它收到的所有4个字节一次?
Arduino的:
void loop() {
Serial.print("blah");
delay(1000);
}
OBJ-C:
- (void)serialPort:(ORSSerialPort *)serialPort didReceiveData:(NSData *)data {
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
}
设置此方法中的断点显示data
仅持有1个字节。
这是正常的,预期的行为。 底层的串行硬件和软件没有办法知道你有多少字节等待,或者说完整的数据包看起来像的方式,从而它有它只是提供数据。你必须在你的Objective-缓冲数据C代码。 从根本上说,这是非常简单的。 创建一个NSMutableData
,你可以作为一个缓冲,应该使用:
@property (strong) NSMutableData *incomingDataBuffer;
初始化(例如,在-init
):
_incomingDataBuffer = [[NSMutableData alloc] init];
然后,在你-serialPort:didReceiveData:
- (void)serialPort:(ORSSerialPort *)serialPort didReceiveData:(NSData *)data
{
[self.incomingDataBuffer appendData:data];
if ([self dataBufferHasCompletePacket]) { // Check to see if buffer contains a complete, valid packet
[self processReceivedDataPacket:self.incomingDataBuffer]; // Do whatever you need to do with the received data
[self.incomingDataBuffer replaceBytesInRange:NSMakeRange(0, [self.incomingDataBuffer length]) withBytes:NULL length:0]; // Clear data buffer
}
}
这是一个良好的开端。 它有一些缺陷,即它会停转,从来没有弄清楚,数据已经停止了进来,例如如果一个贪官包过来的电线,接着一个有效的,或串行电缆是在包的中间拔出权利。 这些缺陷可以通过一个精心设计的信息包格式的组合是固定的,例如包括一个特有的标题,校验和和/或端序列和使所述接收器重置其状态超时。
我脑子里想的一些增强功能ORSSerialPort本身来解决这个问题非常。 还有在这个这方面的东西了一些讨论的问题在GitHub上。 随意添加您的意见和建议,在这个问题上,如果这是你感兴趣的东西。
文章来源: Why does ORSSerialPort serialPort:didReceiveData NSData only have single byte?