Данные ORSSerialPort, которые должны быть одной строкой, поступают через несколько строк

У меня есть Arduino, который выдает одну строку данных GPS по последовательной линии каждые полсекунды, и я знаю, что это работает, потому что я могу смотреть на последовательный монитор в IDE Arduino и каждые полсекунды появляется новая отдельная строка данных.

Сейчас я нахожусь в процессе написания программы для Mac с использованием Swift, которая помещает каждую координату на карту при входе через последовательный порт, и использую библиотеку ORSSerialPort для подключения к arduino и получения ее данных. Это отлично работает, и у меня была базовая версия, работающая ранее, однако я заметил, что в данных GPS были пробелы (они появлялись в небольших группах на карте, с заметным промежутком между ними, когда они должны быть постоянной линией их),

До того, как у меня была карта, у меня было текстовое поле, в которое добавлялась бы каждая строка данных GPS по мере ее поступления, которая производила тот же вывод, что и последовательный монитор IDE arduino, поэтому я думал, что все работает нормально.

Чтобы попытаться исправить проблему с картой, я удалил код карты и просто print()вычеркнул каждую строку в XCode IDE, как она поступила через последовательный порт. К моему удивлению, в данных были случайные разрывы строк, и я не понимаю, почему. Я чувствую, что это может вызывать проблемы, которые у меня возникают (с разделением строки на каждую запятую, чтобы я мог извлечь отдельные значения), поэтому хотел бы знать, почему это происходит в виде одной строки в IDE arduino и текстовом поле, но не в XCode IDE и, вероятно, всякий раз, когда я работаю со строкой.

РЕДАКТИРОВАТЬ: я поставил префикс печати в XCode IDE и вывод в текстовое поле с пятью плюсами и суффикс их пятью тире, а затем установил закрытие последовательного порта после отправки одного отчета (что должно быть одной строкой данных). Вывод, который я получил для обеих вещей, закончился тремя строками, каждая с префиксом и суффиксом плюс и тире. Смотрите фото ниже, где показано, что должно быть одной строкой:

Почему мои отдельные строки данных проходят через несколько строк и ведут себя как отдельные переменные (так как при получении последнего символа строки возвращается последний символ первой строки из трех, а не точка с запятой)?

1 ответ

Решение

Проблема, скорее всего, не в том, что вставляются дополнительные символы новой строки. Скорее, ORSSerialPort (как и используемый им POSIX API) просто сообщает данные своему делегату по мере его поступления. Он не может знать, что для вашего конкретного случая использования вам нужны только полные строки.

Вам необходимо буферизовать входящие данные и обрабатывать их только тогда, когда вы получили полную "строку"/ пакет. ORSSerialPort включает в себя API, ORSSerialPacketDescriptor это делает это проще. Дополнительную документацию по этому API можно найти здесь: https://github.com/armadsen/ORSSerialPort/wiki/Packet-Parsing-API

Обратите внимание, что этот API (пока) не поддерживает использование только конечного разделителя. Вам нужно проверить весь пакет от начала до конца, так как процедура разбора "ленивая". То есть он пытается найти наименьшее возможное совпадение, начиная с конца пакета.

Другие вопросы по тегам