Обработка: один файл напишет, другой нет

У меня странная ошибка, которую я действительно не могу обнаружить. Ситуация такова, что у меня есть доска Arduino с датчиком температуры и освещенности: датчик освещенности используется для определения, открыта ли определенная комната (свет гаснет, если в течение определенного времени в комнате нет движения). Я использую последовательный порт для передачи данных на сервер, на котором выполняется сценарий обработки. Плата Arduino нажимает кнопку "OPEN", если чувствительный источник света находится выше определенного порога, "CLOSED", если это не так. Это также повышает температуру на новой строке. Это повторяется каждые две секунды.

Мониторинг последовательного порта с помощью Minicom, который, кажется, все работает нормально. Даже в сценарии выводимые мной данные подтверждают, что все должно работать нормально. За исключением того, что когда я пытаюсь записать данные в "open.txt", кажется, что это не так, в то время как "temp.txt" работает нормально (Попытка хвоста -f обоих файлов, temp.txt обновляется, а open.txt просто продолжал быть пустым.

import processing.serial.*;
Serial mySerial;
PrintWriter openClosedFile;
 String openClosedFileName;
String currentOpenClosed;
PrintWriter temperatureFile;
String temperatureFileName;
int currentTemp;

void setup() 
{
   mySerial = new Serial(this, Serial.list()[0], 9600);
   openClosedFileName = "open.txt";
   openClosedFile = createWriter(openClosedFileName);
   currentOpenClosed = "CLOSED";
   temperatureFileName = "temp.txt";
   temperatureFile = createWriter(temperatureFileName);
   currentTemp = 0;
}

void draw() 
{
    if (mySerial.available() > 0 ) 
    {
         String value = mySerial.readStringUntil('\n');
         if ( value != null ) 
         {
           String timestamp = nf(day(),2) + "/" + nf(month(), 2) + "/" + year() + " " +         nf(hour(),2) + ":" + nf(minute(),2) + ":" + nf(second(),2);
       println(timestamp);
       value = trim(value);
           if (isNumeral(value))
             writeTemperature(value);
           else
             writeOpenClosed(value);
         }
    }
}

void writeOpenClosed(String val)
{
  print("OpenClosed: ");
  println(val);
  boolean writtenToFile = false;
  openClosedFile = createWriter(openClosedFileName);
  if (val.equals("OPEN") && !currentOpenClosed.equals("OPEN"))
  {
    println("val=OPEN and currentOpenClosed!=OPEN");
    openClosedFile.print("1");
    writtenToFile = true;
  }
  else if (val.equals("CLOSED") && !currentOpenClosed.equals("CLOSED"))
  { 
    println("val=CLOSED and currentOpenClosed!=CLOSED");
    openClosedFile.print("0");
    writtenToFile = true;
  }

  if (writtenToFile)
  {
    currentOpenClosed = val;
    openClosedFile.flush();
    openClosedFile.close();
    println("Written OpenClosed To File");
  }
}

void writeTemperature(String val)
{
  print("temperature: ");
  println(val);
  int intTemp = Integer.parseInt(val);
  if (intTemp != currentTemp)
  {
    currentTemp = intTemp;
    temperatureFile = createWriter(temperatureFileName);
    temperatureFile.print(val);
    temperatureFile.flush();
    temperatureFile.close();
    println("Written Temperature To File");
  }
}

boolean isNumeral(String val)
{
  for (int i = 0; i < val.length(); i++)
  {
    if (val.charAt(i) < 48 || val.charAt(i) > 57)
      return false;
  } 
  return true;
}

Я ожидаю, что там будет какая-то синтаксическая ошибка (я раньше не использовал обработку), но обе функции, кажется, делают то же самое...

Пример вывода:

Listening for transport dt_socket at address: 8212

30/10/2014 12:14:57
OpenClosed: CD
30/10/2014 12:14:57
temperature: 24
Written Temperature To File
30/10/2014 12:14:59
OpenClosed: CLOSED
30/10/2014 12:14:59
temperature: 25
Written Temperature To File
30/10/2014 12:15:01
OpenClosed: CLOSED
30/10/2014 12:15:01
temperature: 24
Written Temperature To File
30/10/2014 12:15:03
OpenClosed: CLOSED
30/10/2014 12:15:03
temperature: 25
Written Temperature To File
30/10/2014 12:15:05
OpenClosed: OPEN
val=OPEN and currentOpenClosed!=OPEN
Written OpenClosed To File
30/10/2014 12:15:05
temperature: 20
Written Temperature To File
30/10/2014 12:15:07
OpenClosed: OPEN
30/10/2014 12:15:07
temperature: 20
30/10/2014 12:15:09
OpenClosed: OPEN
30/10/2014 12:15:09
temperature: 20
^C

Я что-то не вижу или что здесь происходит?

1 ответ

Ладно, думаю, я понял это, на самом деле я был глупым.

Для будущих будущих читателей: звонок

openClosedFile = createWriter(openClosedFileName);

в функции writeOpenClosed() файл откроется, а если ничего не будет записано, он никогда не закроется. Поскольку файл никогда не будет закрыт (так как при следующем вызове функции будет создан новый объект), он не освободит файл для чтения.

Другие вопросы по тегам