I have an RFID scanner attached to a RedPark serial cable connected to an iPad app. When people scan their RFID cards, I get a callback with -readBytesAvailable:. However, sometimes it doesn’t give me the entire RFID in one call. Sometimes it send it in two calls.
How can I determine if I’ve received everything? When my code takes the first callback’s data and tries to use it, I get an error, because let’s say the RFID was “123456789” sometimes I’ll get one call with @”12″ and a second call with @”3456789″. So I try to process @”12″ and get a user not found error, then I try to process @”3456789″ and get a user not found error.
How can I tell if I’m done reading data? The lengths of the RFIDs can vary from vendor to vendor, so I can’t just assume I need to read a certain number of digits.
This is the method I use to receive the data from the scanner through the RedPark:
- (void) readBytesAvailable:(UInt32)length {
NSLog(@"readBytesAvailable: %lu", length);
UInt8 rxLoopBuff[LOOPBACK_TEST_LEN];
[self.rfidManager read:rxLoopBuff Length:length];
NSString *rfid = [[NSString alloc] initWithBytes:rxLoopBuff length:length encoding:NSUTF8StringEncoding];
NSLog(@"rfid=%@", rfid);
[self receivedScanOfRFID:rfid];
}
Serial port gives you no control over packetization. Data is just a stream of bytes with no way to predict which bytes appear in each read call. You have to parse the data stream itself to interpret the contents and understand start/end of your messages. You either need to look for a reliable terminating character or potentially use a timeout approach where you do multiple reads until you get no more data for some period of time. I don’t recommend the timeout approach.