2015-10-26 14 views
0

Я новичок в программировании с помощью linux/raspbian, и я пытаюсь создать программу, которая извлекает системное время Pi и записывает ее в текстовый файл всякий раз, когда контакт 23 идет высоко. Контакт 23 подключен к защелке S-R, а штырек 24 посылает сигнал сброса для сброса защелки.Программа Raspberry Pi - C не записывается в текстовый файл

Проблема, с которой я сталкиваюсь, заключается в том, что она ничего не пишет о текстовом файле, который был создан. Программа создает файл в порядке, но ничего не пишет. Вот мой код:

using namespace std; 
FILE *f; 
struct timeval curTime; 

int main(int argc, char *argv[]){ 
char dateiname[256] = ""; 
int i=0; 
int milli; 
int seconds_in_day; 

wiringPiSetupGpio(); 

time_t t = time(0); 
struct tm * now = localtime(&t); 

//Create and open file 
sprintf(dateiname, "/home/raspbian/Desktop/%02d%02d%02d_%02d_%02d.txt", 
         now -> tm_year+1900, 
         now -> tm_mon+1, 
         now -> tm_mday, 
         now -> tm_hour, 
         now -> tm_min); 

f = fopen(dateiname, "w"); 
//write heading to file before loop 
fprintf(f, "Picture, system time\n"); 

//Set 23 & 24 as input/ output 
pinMode(23, INPUT); 
pullUpDnControl(23, PUD_DOWN); 
pinMode(24, OUTPUT); 

while(1){ 
if(digitalRead(23)){ //If 23 is high 
    i=i+1; 
    gettimeofday(&curTime, NULL); 
    milli = curTime.tv_usec/1000; //Get time in milliseconds 
    seconds_in_day = curTime.tv_sec % 86400; //Get seconds since midnight 
    fprintf(f, "&d &d.%d\n", i, seconds_in_day, milli); //Write to file 

    //send out reset signal 
    digitalWrite(24, HIGH); 
    //pause for 1 second 
    delay(1000); 
} 
} 
fclose(f); 
return(0); 
} 

У кого-нибудь есть очевидные ошибки? Я также запускаю программу в терминале через

sudo /home/raspbian/Desktop/program 

и просто выйти из программы, покинув окно терминала. Спасибо

+0

Что произойдет, если вы удалите 'в то время как (1)'? –

+0

Возможно, это поможет http://unix.stackexchange.com/questions/82952/is-it-harmful-to-close-a-terminal-window-without-properly-exiting-an-application. В зависимости от того, как вы пишете запись файла, возможно, завершение работы оболочки приводит к тому, что 'fclose' не будет вызван. – mathematician1975

+1

Проверьте, удалось ли fopen открыть файл, проверив возврат нулевого указателя (при сбое). – Unimportant

ответ

3

Это, вероятно, буферизация вывода. Буфер не обязательно записывается до тех пор, пока не выполнится fclose, что никогда не будет.

Если вы хотите, чтобы файл обновлялся один раз в секунду с помощью одной строки, когда контакт 23 высок, поместите файл fopen и fclose внутри цикла. Если вы хотите, чтобы добавить строку каждую секунду, затем добавьте fflush(f); после fprintf.

+0

Я помещал' fflush (f) 'после каждого' fprintf', и заголовок записывает в текстовый файл. У меня все еще возникают проблемы с тем, что программа не пишет системные времена, но вы решили исходную проблему. Спасибо – oodan123

+0

@ oodan123 С одной стороны, спецификатор формата ошибочен '' & d & d.% D \ n "' -> "% d% d.% D \ n" – Gene

1

Я подозреваю, что выход на контакте 24 должен быть «коротким» периодом «высокого», чтобы заставить защелку сбросить, а затем вернуться к «низкому» при подготовке к следующей перезагрузке защелки ,

линии нравится: while(!digitalRead(23)); будет гореть много циклов процессора, поэтому может понадобиться поставить некоторые «задержки()» или yield() в тело для каждого из этих петель

using namespace std; 
FILE *f; 
struct timeval curTime; 

int main(int argc, char *argv[]){ 
    char dateiname[256] = ""; 
    int i=0; 
    int milli; 
    int seconds_in_day; 

    wiringPiSetupGpio(); 

    time_t t = time(0); 
    struct tm * now = localtime(&t); 

    //Create and open file 
    sprintf(dateiname, "/home/raspbian/Desktop/%02d%02d%02d_%02d_%02d.txt", 
          now -> tm_year+1900, 
          now -> tm_mon+1, 
          now -> tm_mday, 
          now -> tm_hour, 
          now -> tm_min); 

    if(NULL == (f = fopen(dateiname, "w")) 
    { // then fopen failed 
     perror("fopen failed for output file"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    //write heading to file before loop 
    fprintf(f, "Picture, system time\n"); 
    fflush(f); 

    //Set 23 & 24 as input/ output 
    pinMode(23, INPUT); 
    pullUpDnControl(23, PUD_DOWN); 
    pinMode(24, OUTPUT); 

    // assure latch is reset 
    digitalWrite(24, LOW); 
    digitalWrite(24, HIGH); 
    digitalWrite(24, LOW); 

    while(1) 
    { 
     // wait while pin23 is low 
     while(!digitalRead(23)); 

     // 23 is high 
     i=i+1; 
     gettimeofday(&curTime, NULL); 
     milli = curTime.tv_usec/1000; //Get time in milliseconds 
     seconds_in_day = curTime.tv_sec % 86400; //Get seconds since midnight 
     fprintf(f, "&d &d.%d\n", i, seconds_in_day, milli); //Write to file 
     fflush(f); 

     // if a latch 'set' signal is received during the following 
     // three instructions, then could get locked into 
     // the while pin23 high loop 

     // reset latch 
     digitalWrite(24, HIGH); 
     digitalWrite(24, LOW); 

     // wait for pin 23 to be low 
     while(digitalRead(23)); 
    } // end while 

    fclose(f); 
    return(0); 
} 
Смежные вопросы