cstringatof

How to parse numeric strings recieved over TCP


I'm receiving data from my sensor via TCP and the output looks like this: <-0.040000 , -0.005000 , 0,025000 , 0,990000 , -0,000500 , 0.033000 >

It's a 6 times double value. I need only first three. Forces in X,Y and Z direction to get their resultant force. I was told I'm reciving 'sensor streams string representation of double' and that I should use atof function which takes a string representing of a floating point number and returns a double.

So, the problem is. I'm using following code to receive data from sensor

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

double n;
n = atof (recvbuf);

Output is always wrong, either I get wrong data, 30000 instead of 0.1414, or I read 0.15 as 0. Any tips on how should I get all 3 data? I use BUFFER=50, cuz I don't need to read more and I don't even know how long in total, string from sensor is.


Solution

  • You need to break this down into smaller steps. For example:

    1. Receive an arbitrary sized packet from socket.
    2. Search in the packet buffer (recvbuf) for a start-of-data marker '<'.
    3. Copy all the following characters from the packet buffer to a parse buffer (which you need to create. Make it big enough to hold the longest possible data representation of the 6 data points).
      • 3A. If you find an end-of-data marker '>', go to step 4.
      • 3B. If you run out of data, receive the next packet and repeat step 3.
    4. Break parse buffer at commas into N value strings.
    5. Convert each value string into a number with atof or fscanf.
    6. Go to Step2, starting from the character after the last end-of-data.