Send serial command and wait for reply
The code shown in two previous answers is problematic.

For example, in Look Alterno's code, Serial.println("R") will trigger an R response.  The while(!Serial.available()); construct will wait for the first byte of the response.  Then responseR = Serial.read(); will read one byte.  Next, Serial.println("O") will attempt to trigger an O response.  The second while(!Serial.available()); will wait for a byte to be available, which should happen when the second byte of the R response arrives.  Then responseO = Serial.read() will read that byte. 

In ratchet freak's code, each quarter second bytesToReadFromR and bytesToReadFromO are set to 8.  In the next several passes through loop(), if(bytesToReadFromR) and if(bytesToReadFromO) are satisfied, so while(bytesToReadFromR &amp;&amp; Serial.available()) and while(bytesToReadFromO &amp;&amp; Serial.available()) will be controlled by whether a character is available.  At 9600 bps, about one character per millisecond will become available, so most of the time we are just spinning through loop() dozens of times per millisecond, waiting for characters.  The if statement for bytesToReadFromR has a slightly higher chance of catching fresh characters, but which buffer (responseR or responseO) gets any given character still is left to chance. 

Instead of the code previously shown, consider something like the following:

enum { dataBytes = 8, interval=250 };

float getResult (char trigger) {
  union { byte d[dataBytes], float f[2] } u;
  byte rin=0;
  Serial.print(trigger);
  while (rin &lt; dataBytes) {
    if(Serial.available())
      u.d[rin++] = Serial.read();
  }
  return u.f[0];        // Assumes bytes in forward order
}

unsigned long prevMillis = millis();
float RValue, OValue;

void loop() {
  if(millis() - prevMillis &gt;= interval) {
    prevMillis = millis();
    RValue = getResult ('R');
    OValue = getResult ('O');
    // put code here to consume the results
    // ...
  }
}


Note, this code will get stuck if too-few characters arrive from the R&amp;O device, or if some characters get lost for any reason.  One could add a timeout to the loop in getResult(); it could check for millis() - prevMillis &gt;= interval and if so, break the loop and return a NAN.

Note, this code assumes the byte-order of floats from the R&amp;O device matches that of the Arduino.  That will be so if both are big-endian, or if both are little-endian.  If they differ, store bytes in reverse order into the u.d array, and return u.f[1] instead of u.f[0].

Note, union is a C / C++ technique for accessing data multiple ways.  The declaration union { byte d[dataBytes], float f[2] } u says that u is a structure where the array d starts at the same address as the array f.  Thus, the float u.f[0] corresponds to the first four bytes of u.d, and u.f[1] to the next four. 

Note, if the R&amp;O device requires an end-of-line character, change  Serial.print(trigger) to Serial.println(trigger).