1

フォアグラウンドまたはバックグラウンドで実行できるプログラムを作成しました。プログラムは、シリアル ポートを使用して通信します。フォアグラウンドで起動すると (つまり、フォークしない)、すべて正常に動作します。コマンドラインからデーモンとして起動すると、すべて正常に動作します。

ブート中に起動スクリプトを使用してデーモンとしてバックグラウンドで起動するだけでは、常に正しいボーレートを設定できません。どういうわけか、私が設定した 9600 bps ではなく、デフォルトで 115200 bps になっているようです。シリアルポートの構成には、標準の「termios」構造と関連する関数を使用します。シリアル ポートは、ロード可能なモジュールではなく、カーネル イメージの一部です。関連するコードは次のとおりです。

struct termios TermIO;
speed_t locBaudrate;

...

// retrieve current settings
if (tcgetattr(nFile, &TermIO)==-1) {
    // failed to get attributes
    return false;
}


// initialize anything to 0
memset(&TermIO, 0, sizeof(TermIO));

// set the baudrate
locBaudrate= B9600;
if (cfsetispeed(&TermIO, locBaudrate)==-1) {
    // failed to set the input baudrate
    return false;
}
if (cfsetospeed(&TermIO, locBaudrate)==-1) {
    // failed to set the output baudrate
    return false;
}

... // more configuraton like stop, bitlen, etc

// set the new configuration immediately i.e. do not wait for Rx or Tx to finish
if (tcsetattr(nFile, TCSANOW, &TermIO)==-1) {
    // failed to set parameters
    return false;
}

明確にするために:コマンドラインからプログラムをデーモンとして実行できます(つまり、フォークします)。その後、問題なく動作します。ボーレートの構成が失敗するのは、起動時に /etc/init.d 内のスクリプトを使用してプログラムを起動したときだけです。プログラム自体はバックグラウンドで正常に実行されます。

ここで何が間違っているのでしょうか?

4

0 に答える 0