чтение последовательного вывода arduino построчно с помощью кабеля redpark?

Я разрабатываю приложение для IOS, которое считывает последовательный вывод Arduino через кабель Redpark. На стороне Arduino он использует Serial.println() для отправки строк. Строка имеет формат «12,34x334,45x0,34x123x33». По сути, это комбинация двойников с «x» между ними в качестве специального разделительного символа. Моя первоначальная мысль заключалась в том, что на стороне приложения он будет получать выходные данные Arduino построчно, поэтому я просто использовал

NSString *testString= @"12.34x334.45x0.34x123x33";
NSArray *array = [testString componentsSeparatedByString:@"x"];

чтобы получить NSArray, содержит 12,34 334,45 0,34 123 и 33.

Каким-то образом после прочтения вопросов и ответов, размещенных здесь, я понял, что redpark sdk не может обрабатывать вывод Arduino построчно, он всегда находится в формате X байтов.

Что мне делать, чтобы правильно разобрать строку вывода Arduino? Было бы неплохо добавить начальный и конечный 0 к моим двойным данным, чтобы исходная строка отправлялась фиксированной длины? (например, «03.45x45.50x02.30», чтобы сделать его 17 байт и попытаться прочитать 17 байт данных с помощью redpark sdk?)


person wang    schedule 28.03.2013    source источник
comment
Не обязательно. Например, вы можете прочитать введенный символ за символом, сохранить его в буфере, а когда встретите разрыв строки, обработать содержимое буфера как строку.   -  person angelatlarge    schedule 28.03.2013


Ответы (1)


Redpark SDK только захватывает входящий последовательный поток данных, но не интерпретирует его (несмотря на наличие нескольких вспомогательных процедур) как пакеты. Вам нужно будет закодировать это самостоятельно. Как было предложено agentatlarge в комментариях к вашему вопросу, считывайте данные в буфер, используя readBytesAvailable:numBytes, пока не получите новый символ строки (ASCII 13), после чего у вас будет строка для синтаксического анализа и вы сможете начать все сначала.

Либо пропустите начальную строку: читайте входящие данные, пока не получите "x" (в этот момент вы добавляете строку к NSMutableArray) или символ новой строки (в этот момент вы обрабатываете массив и начать новую.

Имейте в виду, что при использовании настроек по умолчанию (настраиваемых в redparkSerial.h) данные будут передаваться вам порциями, ограниченными 100 мс (rxForwardingTimeout) или 16 байтами (rxForwardCount), в зависимости от того, что наступит раньше. Таким образом, ваша система должна иметь возможность обрабатывать несколько операций чтения до тех пор, пока не будет уверена, что она получила все данные в пакете (напечатанная строка), о чем свидетельствует появление символа новой строки.

person Wildaker    schedule 29.03.2013