为什么ORSSerialPort的SerialPort:didReceiveData NSData的

2019-09-29 03:27发布

从我的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个字节。

Answer 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?