极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11240|回复: 2

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

[复制链接]
发表于 2015-12-6 16:55:35 | 显示全部楼层 |阅读模式
arduino的Stream类中有几个readXXXXXUntil函数,用来进行超时读取,但是这函数的实现方式怎么也想不通啊,纠结了一下午了。
。。。。。。。。。
[pre lang="arduino" line="1" file="sream.cpp"]String Stream::readStringUntil(char terminator)
{
  String ret;
  int c = timedRead();
  while (c >= 0 && c != terminator)
  {
    ret += (char)c;
    c = timedRead();
  }
  return ret;
}[/code]

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

  1. int Stream::timedRead()
  2. {
  3.   int c;
  4.   _startMillis = millis();
  5.   do {
  6.     c = read();
  7.     if (c >= 0) return c;
  8.   } while(millis() - _startMillis < _timeout);
  9.   return -1;     // -1 indicates timeout
  10. }
复制代码

  1.   protected:
  2.     unsigned long _timeout;      // number of milliseconds to wait for the next char before aborting timed read
  3.     unsigned long _startMillis;  // used for timeout measurement
  4.     int timedRead();    // private method to read stream with timeout
  5.     int timedPeek();    // private method to peek stream with timeout
复制代码


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

使用道具 举报

发表于 2015-12-7 16:57:05 | 显示全部楼层
很明显timeout是针对每个字符的读取时间,而且注释也很清楚
unsigned long _timeout;      // number of milliseconds to wait for the next char before aborting timed read
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-7 22:39:02 | 显示全部楼层
YJ.Cai 发表于 2015-12-7 16:57
很明显timeout是针对每个字符的读取时间,而且注释也很清楚
unsigned long _timeout;      // number of m ...

厉害厉害,原来是这样,我还以为是什么能颠覆我认知的黑科技。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 14:48 , Processed in 0.084409 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表