1

Intel Edison の USB 入力から NMEA データを読み取っています。1 つの問題を除いて、すべて正常に動作しています。バルクヘッド コネクタにつながる他の 2 本のケーブルから RS232 - USB ケーブルを外すと、大量の文字がソフトウェアに送信されます。ケーブルが切断される前に送信された最後の文字が大幅に繰り返されているようです。これは、10 インチ程度のオープン ケーブルで何らかの干渉が発生したためだと思われます。ソフトウェアが回復できるようにコードを書きたいのですが、そのままでは、ボックスの電源を入れ直す必要があります。ソフトウェアを強制終了して再起動しても機能しません。有効なペアを取得するまで、入ってくるすべての文字を読み取ってダンプしようとしましたが、これは機能しません。これが私が試したことです:

    while(1){
    while (new_nmea_read_sentence == 0){
        while(read(tty_fd, &aa, 1) == -1);   // read 1 character from stream (blocking call)
        if(aa != '\n')  {
            local_buffer[idx++] = aa;
            if(idx > 400){
                idx = 0;// prevent segmentation faults
                printf("\nlocal_buffer overflow in read nmea.\n");
                int flag = 1;
                char old = 'x';
                while (flag == 1){
                    read(tty_fd, &aa, 1);
                    if (aa == '\n'  && old == '\r') flag = 0;
                    //printf("<%c>",aa);
                    old = aa;
                }
            }
        }
        else{// deal with valid nmea sentence

このスレッドは、データを読み取る永久ループです。他のスレッドがそれを処理し、揮発性フラグを前後に渡します。この問題が発生した場合、最初に目にするのはオーバーフローであり、コード if(idx > 400) でそれをトラップします。それがなければ、セグメンテーション違反が発生します。以下のコード while (flag == 1) は、有効なデータを取得した場合に取得する を探しています。入力が無限の文字列の場合、ケーブルを再接続した後も文字を取得し続けます。ソフトウェアを再起動すると、入力が生成されません。

私の唯一の解決策は、ボックスの電源を入れ直すようにユーザーに指示することです。とても素敵ではありません。

4

2 に答える 2