1

私のアプリでは、ソケット クライアントとシリアル コールバック関数を読み取る while(1) を実行する pthread があります。私のアプリは、シリアル (/dev/ttyS0 など) からメッセージを受信し、ソケットからメッセージを受信します。問題: シリアルからいくつかのメッセージを受信した後、アプリがクラッシュします。この時点では、ソケットは何も受信していません。しかし、スレッドの作成にコメントすると、アプリは正常に動作します。

コード ドラフト:

// Socket Thread
static void *Socket(void *arg)
{
  // socket inicialization
  while (1)
  {
    ret = read(client, buffer, sizeof(buffer)-1);
    // do something
  }
}

// serial callback
static void SerialCallback(int id, unsigned char *buffer, int length)
{
    // do something
}

// main
int main (void)
{
  // start and configure serial callback
  cssl_start();
  Serial = cssl_open(SERIAL_PORT, SerialCallback, 0, 115200, 8, 0, 1);

  // create the pthread
  // If I comment the line below the app work fine
  pthread_create(&Thread_Socket, NULL, Socket, NULL);

  while (1)
  {
  }
}

ノート:

  • ライブラリ cssl (http://sourceforge.net/projects/cssl/) を使用してシリアルを処理します。このライブラリはリアルタイム信号を使用します。

  • テスト目的で、socat を使用して疑似端末 (/dev/pts/XX など) を生成します。

  • シリアル コールバックは、シリアルが 1 つ以上のバイトを受信するたびに呼び出されます。

  • cutecom を使用してシリアルにメッセージを送信しています


2012.07.16 新試験情報追加

最初のテスト: read 関数の行を while(1); に置き換えます。そして問題が続きます(したがって、問題は読み取り機能とは関係ありません)。

2 番目のテスト: 完全なコード (上記の例) を使用して、2 つの外部 USB/シリアル コンバーター ループバックを接続して使用すると、正しく動作します。

4

1 に答える 1

1

@Nikolai N Fetissovは、EINTRシグナルが原因でプログラムが中断したと述べました。cssl ライブラリ コードを調べて、シグナルのフラグを :sa.sa_flags = SA_SIGINFO;からに変更しましたsa.sa_flags = SA_SIGINFO | SA_RESTART;。働いた。

cssl プロジェクトの開発者である Marcin Siennicki に連絡を取り、この投稿のリンクを彼に送りました。

コメントありがとうございます。

于 2012-07-19T13:09:47.803 に答える