Я получаю данные от своего сенсора через 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, потому что мне не нужно больше читать, и я даже не знаю, сколько всего в целом, строка от датчика.
Вам нужно разбить это на более мелкие шаги. Например:
recvbuf
) для маркера начала '<'
. '>'
, перейдите к шагу 4. atof
или fscanf
. Вы вызываете atof
в произвольных точках streamа данных. Это не будет работать.
Для этого необходимо сделать несколько шагов.
Данные, полученные из recv
могут содержать частичный dataset, который должен быть добавлен к предыдущему и по следующим данным recv
вызовов. Иногда это делается конвейерным способом, который считывает символы из recvbuf
в parsebuf
.
Ваши данные выглядят обрамленными (
и )
поэтому ваша программа копирования может перейти к первой (
а затем скопировать данные до следующего )
Когда процедура копирования попадает в конец recvbuf
она должна снова вызвать recv
чтобы заполнить recvbuf
и продолжить кадрирование данных с начала recvbuf
где он остановился в parsebuf
При каждом )
данные в parsebuf
всегда будут
поэтому ваш вызов atof
имеет что-то разумное. Рассмотрите возможность использования fscanf
Сбросьте указатель на parsebuf
после каждого преобразования.