Stepped Serial Output

Hello and thanks in advance for any help you all provide.

Ok here goes!

I have an Arduino Diecimila with a protoshield connected to Mac OS X via USB. I am using Ruby to ask the Arduino for some data. When I ask the data appears to come out missing pieces.

D T=20C
D02B T=20C
D540002B T=20C
DCAE540002B T=20C
D108CAE540002B T=20C
D=108CAE540002B T=20C

Eventually I get all the data as I expect. The strange thing is that the cycle starts over once I get all of it. If I put the Arduino in push mode (where it just sends the data) I get all the data as expected.

Here are the two parts to my program.

Arduino

//#include <SoftwareSerial/SoftwareSerial.h>
// #include <AFSoftSerial/AFSoftSerial.h>
#include <OneWire/OneWire.h>

/* DS1920 Temperature chip i/o
 
 */

OneWire  ds(10);  // on pin 10

#define rxPin 2
#define txPin 3
int incomingByte;      // for incoming serial data
int LastPinVal = LOW;
char outSerial[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  
// Setup the BlueSMiRF on pins 2 & 3
// AFSoftSerial btSerial = AFSoftSerial(rxPin, txPin);
byte pinState = 0;
byte count = 0;


void setup(void) {
  // initialize inputs/outputs
  // start serial port
  //Serial.begin(9600);

  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  Serial.begin(9600);
  Serial.print("\r\nSetup Complete\r\n");

}

void toggle(int pin) {
  digitalWrite(pin, HIGH);
  delay(100);
  digitalWrite(pin, LOW);
}

void read_values() {

  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //Serial.print("No more addresses.\n");
      // Serial.print("No more addresses.\n\r");
      delay(100);
      ds.reset_search();
      return;
  } else {
        // If the type is empty (all zeros) then it's not a valid device.
        // Sleep 1 second and return
        if ( addr[0] == 00) {
          delay(100);
          return;
        }
  
        if ( addr[0] != 0x10) {
            Serial.print("Device is not a DS1920 family device.\r\n");
            return;
        } else {
          Serial.print("D=");
          for( i = 0; i < 8; i++) {
            Serial.print(addr[i], HEX);
          }
            Serial.print(" ");
      

          if ( OneWire::crc8( addr, 7) != addr[7]) {
            Serial.print("CRC is not valid!\n");
            return;
          }
        }

        ds.reset();
        ds.select(addr);
        ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
        delay(2000);     // Temperature conversion can take up to 2 seconds
        // we might do a ds.depower() here, but the reset will take care of it.
  
        present = ds.reset();
        ds.select(addr);
        ds.write(0xBE);         // Read Scratchpad
  
        // if (present) {
        //   Serial.print("Present");
        // }
        // Serial.print(present,HEX);
        // Serial.print(" ");
        for ( i = 0; i < 9; i++) {           // we need 9 bytes
          data[i] = ds.read();
          // Serial.print(data[i], HEX);
          // Serial.print(" ");
        }
        Serial.print("T=");
      delay(10);
      //   Serial.print((data[1])?'-':' ');
      // delay(10);
        Serial.print(data[0]/2, DEC);
      delay(10);
        Serial.println("C");
      //  Serial.print(" CRC=");
      //  Serial.print( OneWire::crc8( data, 8), HEX);
        // Serial.println();

  }
}

void loop(void) {
      // read_values();
        // send data only when you receive data:
        if (Serial.available()) {
          // read the incoming byte:
            incomingByte = Serial.read();
          toggle(11);
               switch ((int)incomingByte) {
              case 49:
                //do something when var == 1
                // Serial.print("Reading Values\r\n");
                    read_values();
                break;
                // break is optional
            }
                    
      }
}

Ruby Client

 require "serialport.so"
 require "Date"
 
 #params for serial port
 # port_str = "/dev/tty.Arduino-BT"  #may be different for you
 port_str = "/dev/tty.usbserial-A4001KMR"  #may be different for you
 baud_rate = 9600
 data_bits = 8
 stop_bits = 1
 parity = SerialPort::NONE
 sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
 input = ""
 
 # my_file = File.new("/Users/danielmorrigan/temp.data", "a+")
 
 Thread.new {
  
   while true do
     my_file = File.new("/Users/danielmorrigan/temp.data", "a+")
     serial_in = sp.getc
     my_file.printf("%c", serial_in)
     printf("%c", serial_in)
     my_file.close
   end
 }
 while true do
    sleep(10)
    sp.putc "1"
 end


#   my_file = File.new("/Users/danielmorrigan/temp.data", "a+")
# while true do
# 
#   serial_in = sp.getc
#   my_file.printf("%c", serial_in)
#   printf("%c", serial_in)
#   
# end
my_file.close
sp.close

Can anyone point me to where I may have gone wrong?