Reputation: 13
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.
Upvotes: 0
Views: 166
Reputation: 41170
You are calling atof
at arbitrary points in the data stream. That will not work.
There are several steps needed to do this reliably.
The data you get from recv
can a partial data set that needs to be appended to the preceding and by the following recv
calls's data. This is sometimes done in a pipeline fashion that reads characters from the recvbuf
into a parsebuf
.
Your data looks to be framed with (
and )
so your copy routine can skip to the first (
and then copy data up to the following )
When the copy routine hits the end of the recvbuf
it should call recv
again to fill the recvbuf
and continue framing the data from the start of recvbuf
where it left off in parsebuf
At each )
the data in the parsebuf
will always be <x> , <y> , <z> , ...
so your atof
call has something reasonable to deal with. Consider using fscanf
Reset the pointer to the parsebuf
after each conversion.
Upvotes: 2
Reputation: 35540
You need to break this down into smaller steps. For example:
recvbuf
) for a start-of-data marker '<'
.'>'
, go to step 4.atof
or fscanf
.Upvotes: 2