0

あなたの助けが必要です。ポートから gps と加速度計のデータを読み取るプログラムがあります。プログラムは次のように動作します。'a' を送信すると、prog は gps データを受信して​​データベースに送信し、'b' を送信すると、prog は加速度計データを送信し、データベースにも保存します。しかし、プログラムを実行すると、GPS データは正常に受信されてデータベースに送信されますが、加速度計データは受信できず、エラーは「セグメンテーション違反です。問題を解決するのを手伝ってくれませんか..?」

int main(void) {

    int fd;
    fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
        perror("open_port: Unable to open port ");
    } else {
        fcntl(fd, F_SETFL, 0);
    }

    char a[] = "a";
    char b[] = "b";

    int n,m,cnt;
    char in[30];
    //char in2[50];
    //char *in;
    //char in2[100];
    //in = (char*) malloc(i+1);
    //if (in == NULL) exit(1);


    MYSQL *conn;

    const char *localhost   = "127.0.0.1";
    const char *user     = "root";
    const char *password = "";
    const char *database = "arduino1";

    conn = mysql_init(NULL);

    // Connect to database 
    if (!mysql_real_connect(conn, localhost, user, password, database, 0, NULL, 0))
    {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
    } 


    for(cnt=0; cnt<5; cnt++) 
    {
        if (cnt < 1) {
            sleep(2);
            n = write(fd, a, sizeof(a));
            printf("Send : %s \n", a);

            //terima data gps dari port
            sleep(1);
            n = read(fd, in, 100);
            if (n < 0)
            {
                perror("read");
                break;
            }

            //query gps         
            char c_lat[50],c_lon[50];
            tokenizer(in,c_lat,c_lon);


            //Isi nilai gps ke database

            char query[255];

            strcat(query,"INSERT INTO gps (latitude, longitude) VALUES (");
                strcat(query,c_lat);
                strcat(query,",");
                strcat(query,c_lon);
                strcat(query,")");

            if (mysql_query(conn, query));
            {
              printf("%s\n", query);
            }


     } else {
            m = write(fd, b, sizeof(b));
            printf("Send : %s \n", b);

            //terima data accelerometer dari port
            sleep(1);
            m = read(fd, in, 100);

            in[m] = '\0';   

            char str[255];

            //query accelerometer   
            char c_nilai_x[10],c_nilai_y[10],c_nilai_z[10],c_teg[6];
            tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg);


            //Isi nilai accelerometer ke database



            strcat(str,"INSERT INTO highcharts_php (x_axis, y_axis, z_axis, tegangan) VALUES (");
                strcat(str,c_nilai_x);
                strcat(str,",");
                strcat(str,c_nilai_y);
                strcat(str,",");
                strcat(str,c_nilai_z);
                strcat(str,",");
                strcat(str,c_teg);
                strcat(str,")");

            if (mysql_query(conn, str));
            {
              printf("%s\n", str);
            }

        }


        // Close database connection
        mysql_close(conn);

    }

    return 0;
}

ご協力ありがとうございました。しかし、私はまだ同じエラーを受け取りました。私の変更はこれです: int main(void) {

int fd;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
    perror("open_port: Unable to open port ");
} else {
    fcntl(fd, F_SETFL, 0);
}

char a[] = "a";
char b[] = "b";

int n,m,cnt;
char in[50];

MYSQL *conn;

const char *localhost   = "127.0.0.1";
const char *user     = "root";
const char *password = "";
const char *database = "arduino1";

conn = mysql_init(NULL);

// Connect to database 
if (!mysql_real_connect(conn, localhost, user, password, database, 0, NULL, 0))
{
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
} 


for(cnt=0; cnt<5; cnt++) 
{
    if (cnt < 1) {
        sleep(2);
        n = write(fd, a, sizeof(a));
        printf("Send : %s \n", a);

        //terima data gps dari port
        sleep(1);
        n = read(fd, in, 20);
        if (n < 0)
        {
            perror("read");
            break;
        }

        //query gps         
        char c_lat[10],c_lon[9];
        tokenizer(in,c_lat,c_lon);


        //Isi nilai gps ke database

        char query[255] = "INSERT INTO gps (latitude, longitude) VALUES (";
            strcat(query,c_lat);
            strcat(query,",");
            strcat(query,c_lon);
            strcat(query,")");

        if (mysql_query(conn, query));
        {
          printf("%s\n", query);
        }


 } else {
        m = write(fd, b, sizeof(b));
        printf("Send : %s \n", b);

        //terima data accelerometer dari port
        sleep(1);
        m = read(fd, in, 30);

        in[m] = '\0';   



        //query accelerometer   
        char c_nilai_x[8],c_nilai_y[8],c_nilai_z[8],c_teg[4];
        tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg);


        //Isi nilai accelerometer ke database


        char str[255] = "INSERT INTO highcharts_php (x_axis, y_axis, z_axis, tegangan) VALUES (";
            strcat(str,c_nilai_x);
            strcat(str,",");
            strcat(str,c_nilai_y);
            strcat(str,",");
            strcat(str,c_nilai_z);
            strcat(str,",");
            strcat(str,c_teg);
            strcat(str,")");

        if (mysql_query(conn, str));
        {
          printf("%s\n", str);
        }

    }


    // Close database connection
    mysql_close(conn);

}

return 0;

}

そして、プログラムを実行したときの結果は次のとおりです。

送信: a INSERT INTO gps (緯度、経度) 値 (-6.889760,107.619659) 送信: b セグメンテーション違反 (コアダンプ)

助けが必要です....ありがとう

4

2 に答える 2

5

これはエラーです:

char query[255];
strcat(query,"INSERT INTO gps (latitude, longitude) VALUES (");

strcat()エントリで宛先バッファをnullで終了する必要があり、初期化されていません。これは、がヌル文字strcat()を検索しquery、どこでヌル文字が見つかるかを誰が知っているかを意味します。おそらく、その範囲を超えて、メモリに書き込むべきではないquery結果になる可能性があります。strcat()への変更:

char query[255] = "INSERT INTO gps (latitude, longitude) VALUES (";

コードの後半で同じエラーが発生しstrます。

複数の呼び出しを使用する代わりにstrcat()、より安全な呼び出しを使用しますsnprintf()

char query[255];
int result = snprintf(query,
                      255,
                      "INSERT INTO gps (latitude, longitude) VALUES (%s,%s)",
                      c_lat,
                      c_lon);

/* See following paragraph for explanation of this condition. */
if (result > 0 && result < 255)
{
}

snprintf()戻り値 (セクション7.19.6.5 C99 標準の snprintf 関数から):

snprintf 関数は、n が十分に大きい場合に書き込まれたであろう文字数を返します。エンコーディング エラーが発生した場合は、終端の null 文字をカウントしません。負の値を返します。したがって、戻り値が非負で n 未満である場合にのみ、null で終了する出力が完全に書き込まれます。

于 2013-05-21T09:47:32.637 に答える
0

sizeof(a)+1'\0' 終了を示す必要があるかもしれません。

また、http://www.thinkage.ca/english/gcos/expl/c/lib/strcat.htmlchar in[30];を読んだとき、あなたがm = read(fd, in, 100); 読む量は30未満でなければなりません。tokenizer_acmが各パラメーターを「\0」で終了するかどうか疑問に思っています。ちなみに、デバッガーを使用できなかった場合は、c_nilai_x、c_nilai_y、c_nilai_z、c_teg を静的な値で設定してみてください。

于 2013-05-21T09:59:06.320 に答える