问题
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
atoforfscanf. - 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
recvcan a partial data set that needs to be appended to the preceding and by the followingrecvcalls's data. This is sometimes done in a pipeline fashion that reads characters from therecvbufinto 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
recvbufit should callrecvagain to fill therecvbufand continue framing the data from the start ofrecvbufwhere it left off inparsebufAt each
)the data in theparsebufwill always be<x> , <y> , <z> , ...so youratofcall has something reasonable to deal with. Consider usingfscanfReset the pointer to the
parsebufafter each conversion.
来源:https://stackoverflow.com/questions/33618837/how-to-parse-numeric-strings-recieved-over-tcp