2

まず、次のコード ブロックを参照してください。

while(1) {
    lt = time(NULL);
    ptr = localtime(&lt);

    int n = read (fd, buf, sizeof(buf));
    strftime(str, 100, "%c", ptr);

    int temp = sprintf(tempCommand, "UPDATE roomtemp SET Temperature='%s' WHERE Date='Today'", buf);
    temp = sprintf(dateCommand, "UPDATE roomtemp SET Date='%s' WHERE Type='DisplayTemp'", str);

    printf("%s", buf);
    mysql_query(conn, tempCommand);
    mysql_query(conn, dateCommand);
}   

読み取り関数は、実際にはシリアル ポートから入ってくるデータを読み取ります。それはうまく機能しますが、私が経験している(私が思うに)問題は、ループの実行にかかる時間です。毎秒シリアルポートにデータが送信されています。データが毎秒「22」であるとします。このループが何をするかは、「2222」または場合によっては「222222」で読み取られます。私が考えているのは、ループの繰り返しに時間がかかりすぎて、データがシリアル バッファに蓄積されることです。read ステートメントはバッファ内のすべてを読み取るため、値が繰り返されます。

これを回避する方法はありますか?おそらくループの最後で、バッファをフラッシュできます。しかし、これを行う方法を知っているかどうかはわかりません。または、ループ内のコードを削減して、最初に各反復にかかる全体の時間を短縮する方法があるかもしれません。私の推測では、とにかく MySQL クエリが最も時間がかかるものです。

4

1 に答える 1

2

まず、 からのエラーをチェックしread、受信した「文字列」を適切に終了する必要があります。

問題を続行するには、これを解決する方法がいくつかあります。1つは、シリアルポートからの読み取りまたはデータベースの更新を別のスレッドに入れることです。次に、スレッド間で「メッセージ」を渡すことができます。ただし、データベースが遅く、メッセージ キューが蓄積される可能性があるため、注意してください。このメッセージの蓄積は、サイズ 1 のメッセージ キューを使用することで回避できます。これには常に最新の温度読み取り値が含まれます。次に、温度読み取りスレッドが設定する単一のフラグと、データベース更新スレッドがチェックしてからクリアする必要があるだけです。

別の解決策は、通信に使用されるプロトコルを変更して、メッセージの大きさを示す数字を含めることです。

于 2012-10-22T03:30:14.717 に答える