title: How to Convert Float to NSData Bytes
body: <p>Using the following code, I am attempting to convert three float values into a single NSData object, which I can then transmit over a serial port.</p>
  
  <pre><code>    float kP = [[self.kPTextField stringValue] floatValue];
      float kI = [[self.kITextField stringValue] floatValue];
      float kD = [[self.kDTextField stringValue] floatValue];
      float combined[] = {kP, kI, kD};
  
      NSData *dataPackage = [NSData dataWithBytes:&amp;combined length:sizeof(combined)];
  
      [self.serialPort sendData:dataPackage];
  </code></pre>
  
  <p>The problem is that it doesn't seem to work very well. Whenever I use the "sizeof()" C function, it tells me that the "dataPackage" is only 8 bytes, even though 3 float values should total 12 bytes. I am receiving the data with an Arduino. It sees the bytes coming in, but they aren't legible at all. I don't think it's a problem on the Arduino side of things (but who knows?).</p>
  
  <p>Any help would be appreciated! I'm not a CS major, just a bio major, and I've never learned this stuff in a formal way so I am sorry if my question is ridiculous. I've spent several hours searching the net about this problem and haven't found anything that helped. </p>
  
  <p>EDIT: It turns out this code was completely correct. I made a simple mistake on the arduino side of things by using a struct instead of a union to take the bytes and convert them back into floats. </p>
  
  <p>For others who may be in a similar predicament, a successful way to convert floats from bytes coming out of the serial port is the following:</p>
  
  <p>(at top of implementation file)</p>
  
  <pre><code>union {
    float pidVals[3];
    byte bytes[12];
  } pidUnion;
  </code></pre>
  
  <p>(inside loop)</p>
  
  <pre><code>if (Serial.available() &gt; 11) {
  
    for (int i = 0; i &lt; 12; i++) {
      pidUnion.bytes[i] = Serial.read();
    }
  
  }
  
  //Now, you can get access to all three floats of data using pidUnion.pidVals[0], pidUnion.pidVals[1], etc.
  </code></pre>
  
  <p>This probably isn't the best or most reliable way to transmit data. There is no error-correcting mechanism or packet structure. But it does work in a pinch. I imagine you would probably want to find a way to create a packet of data along with a hash byte to make sure all of the data is correct on the other side, this code doesn't have any of that though.</p>