在循环运行时从串行端口连续读取数据

时间:2012-10-22 03:13:45

标签: mysql c while-loop

首先,请参阅此代码块:

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查询无论如何都是花费最多的时间。

1 个答案:

答案 0 :(得分:2)

首先,您应检查来自read的错误,并正确终止收到的“字符串”。

要继续解决您的问题,有几种方法可以解决这个问题。一种是将串口读取或数据库更新放在单独的线程中。然后你可以在线程之间传递“消息”。但要小心,因为您的数据库似乎很慢并且消息队列可能会累积。通过使用大小为1的消息队列可以避免此消息构建,该消息队列始终包含最新的温度读取。然后,您只需要一个温度读取线程设置的标志,数据库更新线程检查然后清除。

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