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 的消息队列来避免,该队列始终包含最新的温度读数。然后你只需要温度读取线程设置的一个标志,数据库更新线程检查然后清除。

另一种解决方案是修改用于通信的协议,因此它包含一个数字来表示消息的大小。

于 2012-10-22T03:30:14.717 回答