Several comments. First, you are collecting the data into a char array. Then, you are wrapping that char array in a String. Why?
There is no reason for hiding the character data in a String object, especially as the atof() function has no idea how to deal with a String.
Second, it is clear that you do not understand the relationship between a char array and a string (with a lower case s). Functions like atof() and the String constructor expect strings. A string is a NULL terminated array of chars. value is an array of chars, but it is not a string, because it is not NULL terminated.
Until you NULL terminate the array of chars, you can not pass the char array to functions like atof() or the String constructor and expect correct things to happen.
If you did understand this relationship, you would know that functions that expect strings stop reading the character data at the NULL, so
for(int k =0 ; k<15;k++){value[k]=0;}
is unnecessary. Simply set value[0] to NULL ('\0').
Your parse_data() function declaration should look something like this:
void parse_data(char *data, float &servo, float &pwm, float &pressure)
{
}