Как анализировать числовые строки, полученные по TCP

Я получаю данные от своего сенсора через TCP, и результат выглядит следующим образом:

Это 6-кратное двойное значение. Мне нужно только первые три. Силы в направлениях X, Y и Z, чтобы получить их результирующую силу. Мне сказали, что я возвращаю строковое представление «stream streams double» и что я должен использовать функцию atof, которая берет строку, представляющую число с плавающей запятой, и возвращает double.

Итак, проблема в этом. Я использую следующий код для получения данных от датчика

char recvbuf[DEFAULT_BUFFER_LENGTH]; int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0); double n; n = atof (recvbuf); 

Выход всегда ошибочен, либо я получаю неправильные данные, 30000 вместо 0.1414, либо я читаю 0,15 как 0. Любые советы о том, как мне получить все 3 данных? Я использую BUFFER = 50, потому что мне не нужно больше читать, и я даже не знаю, сколько всего в целом, строка от датчика.

Вам нужно разбить это на более мелкие шаги. Например:

  1. Получите пакет произвольного размера из сокета.
  2. Поиск в буфере пакетов ( recvbuf ) для маркера начала '<' .
  3. Скопируйте все следующие символы из буфера пакетов в буфер синтаксического анализа (который необходимо создать. Сделайте его достаточно большим, чтобы хранить максимально возможное представление данных из 6 точек данных).
    • 3A. Если вы найдете маркер конца '>' , перейдите к шагу 4.
    • 3B. Если у вас закончились данные, получите следующий пакет и повторите шаг 3.
  4. Разбейте буфер parsingа в запятую на строки N значений.
  5. Преобразуйте каждую строку значений в число с помощью atof или fscanf .
  6. Перейдите к Шагу 2, начиная с символа после последнего конца данных.

Вы вызываете atof в произвольных точках streamа данных. Это не будет работать.

Для этого необходимо сделать несколько шагов.

  1. Данные, полученные из recv могут содержать частичный dataset, который должен быть добавлен к предыдущему и по следующим данным recv вызовов. Иногда это делается конвейерным способом, который считывает символы из recvbuf в parsebuf .

  2. Ваши данные выглядят обрамленными ( и ) поэтому ваша программа копирования может перейти к первой ( а затем скопировать данные до следующего )

  3. Когда процедура копирования попадает в конец recvbuf она должна снова вызвать recv чтобы заполнить recvbuf и продолжить кадрирование данных с начала recvbuf где он остановился в parsebuf

  4. При каждом ) данные в parsebuf всегда будут , , , ... поэтому ваш вызов atof имеет что-то разумное. Рассмотрите возможность использования fscanf

  5. Сбросьте указатель на parsebuf после каждого преобразования.