2016-01-29 3 views
-1

Я читаю данные из последовательного порта. Мне удалось настроить порт и прочитать его в буфере, но я не могу понять, как преобразовать данные, хранящиеся в буфере, в float.Как преобразовать boost :: asio :: streambuf в float?

float Serial::ReadData() 
{ 
    boost::asio::streambuf buff; 
    int bytesRead = read_until(*port, buff, "\n"); 
    boost::asio::const_buffers_1 constBuff = buff.data(); 
    char*data = nullptr; 
    int pos = 0; 
    for (auto buffer = constBuff.begin(); buffer != constBuff.end(); buffer++) 
    { 
     data[pos] = reinterpret_cast<char>(buffer); 
     pos++; 
    } 
    buff.consume(bytesRead); 
    return atof(data); 
} 
+0

Вы даже не указать, что streambuf содержит. Является ли он двоичным? Ascii? base64? Сжатый? IEEE raw bytes? ' – sehe

+0

Я читаю от bluetooth, подключенного к COM-порту, поэтому я считаю, что он отправляет сырые байты. – ZeroPhase

+0

В этом случае ваш автоответ не имеет никакого смысла. http://en.cppreference.com/w/cpp/string/byte/atof Более того, если вы не знаете точный формат проводов, на него никто не может ответить. Заметьте, мой ответ делает логически то же самое, что и ваш 'atof'. Я собираюсь выйти на конечность и предположить, что, очевидно, вы уже выяснили, что формат представляет собой текстовое представление. – sehe

ответ

-1

Ну, я понял, как это сделать. Это было намного проще, чем я думал.

float Serial::ReadData() 
{ 
    boost::asio::streambuf buff; 
    int bytesRead = read_until(*port, buff, "\n"); 
    char*data = new char[bytesRead]; 
    buff.sgetn(data, bytesRead); 
    return atof(data); 
} 
0

альтернативно

Live On Coliru

На данный момент это может выглядеть практически эквивалентны, но:

  • это не утечка памяти
  • это Безразлично» t копировать буфер понапрасну
  • он обрабатывает ошибки
  • гораздо более гибким, если вы хотите, чтобы разобрать более 1 вещь
#include <boost/asio.hpp> 
#include <iostream> 
#include <stdexcept> 

struct Serial { 
    float ReadData(); 

    boost::asio::serial_port* port = nullptr; 
}; 

float Serial::ReadData() 
{ 
    boost::asio::streambuf buff; 
    /*int bytesRead = */read_until(*port, buff, "\n"); 
    std::istream is(&buff); 
    float f; 
    if (is >> f) 
     return f; 
    throw std::invalid_argument("ReadData"); 
} 

int main(){} 
Смежные вопросы