问题
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.
回答1:
You need to break this down into smaller steps. For example:
- Receive an arbitrary sized packet from socket.
- Search in the packet buffer (
recvbuf
) for a start-of-data marker'<'
. - 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.
- 3A. If you find an end-of-data marker
- Break parse buffer at commas into N value strings.
- Convert each value string into a number with
atof
orfscanf
. - Go to Step2, starting from the character after the last end-of-data.
回答2:
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 followingrecv
calls's data. This is sometimes done in a pipeline fashion that reads characters from therecvbuf
into aparsebuf
.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 callrecv
again to fill therecvbuf
and continue framing the data from the start ofrecvbuf
where it left off inparsebuf
At each
)
the data in theparsebuf
will always be<x> , <y> , <z> , ...
so youratof
call has something reasonable to deal with. Consider usingfscanf
Reset the pointer to the
parsebuf
after each conversion.
来源:https://stackoverflow.com/questions/33618837/how-to-parse-numeric-strings-recieved-over-tcp