wwwymq 发表于 2015-12-6 16:55:35

各路大神来解释下这段代码,快想疯了。。。

arduino的Stream类中有几个readXXXXXUntil函数,用来进行超时读取,但是这函数的实现方式怎么也想不通啊,纠结了一下午了。
。。。。。。。。。
String Stream::readStringUntil(char terminator)
{
String ret;
int c = timedRead();
while (c >= 0 && c != terminator)
{
    ret += (char)c;
    c = timedRead();
}
return ret;
}

这个方法调用了timedRead()这个函数判断是否超时。问题就出在这个timedRead函数上。

int Stream::timedRead()
{
int c;
_startMillis = millis();
do {
    c = read();
    if (c >= 0) return c;
} while(millis() - _startMillis < _timeout);
return -1;   // -1 indicates timeout
}


protected:
    unsigned long _timeout;      // number of milliseconds to wait for the next char before aborting timed read
    unsigned long _startMillis;// used for timeout measurement
    int timedRead();    // private method to read stream with timeout
    int timedPeek();    // private method to peek stream with timeout

这个被反复调用的函数每一次都给_startMillis赋了调用时时间,根本没法实现功能,单独复制出来就没法用,但是调用readStringUntil就是正常的,大家帮我想想。

YJ.Cai 发表于 2015-12-7 16:57:05

很明显timeout是针对每个字符的读取时间,而且注释也很清楚
unsigned long _timeout;      // number of milliseconds to wait for the next char before aborting timed read

wwwymq 发表于 2015-12-7 22:39:02

YJ.Cai 发表于 2015-12-7 16:57 static/image/common/back.gif
很明显timeout是针对每个字符的读取时间,而且注释也很清楚
unsigned long _timeout;      // number of m ...

厉害厉害,原来是这样,我还以为是什么能颠覆我认知的黑科技。。。
页: [1]
查看完整版本: 各路大神来解释下这段代码,快想疯了。。。