программа автозапуска не работает как ручной запуск - PullRequest
0 голосов
/ 21 сентября 2018

Я написал программу на C, которая автоматически создает таблицу в базе данных sqlite3 и печатает в ней каждые вторые значения.Программа работает нормально, когда я запускаю ее вручную в терминале.
Однако она не работает правильно, когда я запускаю программу при запуске, выполняя ее в / etc / rc.local .
Когда я перезагружаюсь, программа запускается (я вижу ее в списке процессов), но она не создает таблицу и не записывает в нее значения.
Я пытался использовать sudo перед моей командойи & в конце моей команды, но это ничего не меняет.
Я понятия не имею об этой проблеме, но мне нужно, чтобы эта программа работала при запуске.

Это мой rc.local файл.

#!/bin/sh -e
#
# rc.local
#
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

./home/pi/Desktop/RPi_Arduino_Project/rpi5_1 &


exit 0

Может быть, это СУБД, которая еще не запущена в этот момент запуска?
Есть ливозможность запустить терминал и выполнить его там вместо выполнения его непосредственно из rc.local (потому что это работает)?

Редактировать: моя программа:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sqlite3.h>
#include "rs232.h"

#define BUF_SIZE 128    //eventually needs to be bigger

char table_name[256];


int openCOMport(int cport_nr1, int bdrate, char mode[]){
    if(RS232_OpenComport(cport_nr1, bdrate, mode)){
        printf("Can not open comport 1\n");
        return(0);
    }
    sleep(2);
    return(1);
}

int saveinfile(sqlite3 *db, double *output, int rowlength, int newfile){

    time_t t = time(0);
    struct tm *ts = localtime(&t);
    char sql[512];
    char *errMsg;
    char columnnames[256];

    char date_time[256];
    int j = 0;

    //control terminal output
    printf("%02d-%02d-%04d %02d:%02d:%02d ",ts->tm_mday,ts->tm_mon+1,ts->tm_year+1900,ts->tm_hour,ts->tm_min,ts->tm_sec);
    for(j=0; j<rowlength; j++){
        printf(" %.2f ", output[j]);            
    }

    if(newfile == 1){
        sprintf(table_name,"Gas_Sensor_test_%04d_%02d_%02dT%02d_%02d_%02d",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
        printf("Table Name: %s\n",table_name);

        //Create Table and write header
        sprintf(sql, "CREATE TABLE %s (Date date    NOT NULL, Time time NOT NULL, HCHO1 float, HCHO2    float, HCHO3    float, FinFlow1 float, FinFlow2 float, PRIMARY KEY(Date, Time));",table_name);

        //SQL execution
        if(sqlite3_exec(db, sql, NULL, 0, &errMsg) != SQLITE_OK ){
            printf("SQL error: %s\n", errMsg);
            return(0);
        }
    }

    //insert new rows and print time and date 
    sprintf(sql,"INSERT INTO %s (Date, Time) VALUES ('%04d-%02d-%02d', '%02d:%02d:%02d');",table_name,ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
    //printf("SQL Befehl: %s \n",sql); //just control output
    if(sqlite3_exec(db, sql, NULL, 0, &errMsg) != SQLITE_OK ){
        printf("SQL error: %s\n", errMsg);
        return(0);
    }

    //Write data in table
    sprintf(sql,"UPDATE %s SET HCHO1 = %f, HCHO2 = %f, HCHO3 = %f WHERE Date = '%04d-%02d-%02d' AND Time =  '%02d:%02d:%02d';",table_name, output[1], output[2],output[3],ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
    if(sqlite3_exec(db, sql, NULL, 0, &errMsg) != SQLITE_OK ){
        printf("SQL error: %s\n", errMsg);
        return(0);
    }

    return (1); 
}


int main(){
  //port parameters initialization
  int cport_nr1=16;                     // /dev/ttyUSB0
  int bdrate=2000000;                       //Baudrate
  char *out;                            //outputpointer
  char delimiter[] = ";";               //Trennzeichen
  char mode[]={'8','N','1',0};          //8 data bits, no parity, 1 stop bit
  char str_recv[BUF_SIZE];              //recv data buffer
  double sensor_value[20];              //array for storing the sensor values
  int i;


  if(openCOMport(cport_nr1, bdrate, mode) == 0){            //open COMport
    return (0);
  }

  //create database object
  sqlite3 *db;

  if(sqlite3_open("sensor_tests.db", &db)){
      printf("Can't open database");
      return(0);
  }

  int new = 1;
  while(1) {
    int n = RS232_PollComport(cport_nr1, str_recv, (int)BUF_SIZE);
    if(n > 0){
        str_recv[n] = '\0';             //always put a "null" at the end of a string!
        //printf("Received %i bytes: '%s'\n", n, (char *)str_recv);
    }
    else if (n == 0){
      continue;
    }
    else{
      printf("Error while receiving Data");
      return (0);
    }

    out = strtok(str_recv, delimiter);
    i = 0;

    while(out != NULL){
        //printf("String RECV: %s\n",str_recv);
        sensor_value[i]= atof(out);         //converting string to double
        if(sensor_value[i] < 0){
            printf("Sensor value out of range");
        }
        out = strtok(NULL, delimiter);      //next part of input string
        printf("Sensor %d: %.2f   \n",i+1,sensor_value[i]);
        i++;
    }

    double *psensor_value = sensor_value;
    if(saveinfile(db, psensor_value, i, new) == -1){
        printf("Error while writing data in file!");
        break;
    }
    new = 0;
  }
  return(0);
}

1 Ответ

0 голосов
/ 21 сентября 2018

Поэтому я преобразую свой комментарий в ответ согласно совету @Yunnosch.Прежде всего, ответ состоит в том, чтобы дать советы о том, как вообще отлаживать такого рода проблемы.Прежде всего, я бы посоветовал прочитать о rc.local и приоритетах, вы можете, например, выбрать, после каких демонов запускаться, и вы можете внутри своего скрипта проверить, существует ли демон.

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

Например, чтобы проверить, успешно ли соединение с БД (при условии, что вы используете интерфейс sqlite3), вы можете проверить, чтоsqlite3_open() возвращает с хорошим описанием всех кодов ошибок.Отсюда вы можете исключить, если соединение установлено успешно или нет, и перейти к следующей функции и т. Д., Пока не найдете основную проблему.

...