1

As written in the title, could you tell me where to find the source code of the function "Serial.find()"?

I haven' t installed the Arduino IDE, so I'm glad if you could me link a web resource, or if you directly copy the source code here .

Thanks for your time.

asked May 21, 2016 at 18:02

1 Answer 1

1

It is part of the Stream class which the Serial class inherits from.

It just calls findUntil() which is a little further down in the same file:

That itself calls findMulti() which is where all the magic happens:


int Stream::findMulti( struct Stream::MultiTarget *targets, int tCount) {
 // any zero length target string automatically matches and would make
 // a mess of the rest of the algorithm.
 for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
 if (t->len <= 0)
 return t - targets;
 }
 while (1) {
 int c = timedRead();
 if (c < 0)
 return -1;
 for (struct MultiTarget *t = targets; t < targets+tCount; ++t) {
 // the simple case is if we match, deal with that first.
 if (c == t->str[t->index]) {
 if (++t->index == t->len)
 return t - targets;
 else
 continue;
 }
 // if not we need to walk back and see if we could have matched further
 // down the stream (ie '1112' doesn't match the first position in '11112'
 // but it will match the second position so we can't just reset the current
 // index to 0 when we find a mismatch.
 if (t->index == 0)
 continue;
 int origIndex = t->index;
 do {
 --t->index;
 // first check if current char works against the new current index
 if (c != t->str[t->index])
 continue;
 // if it's the only char then we're good, nothing more to check
 if (t->index == 0) {
 t->index++;
 break;
 }
 // otherwise we need to check the rest of the found string
 int diff = origIndex - t->index;
 size_t i;
 for (i = 0; i < t->index; ++i) {
 if (t->str[i] != t->str[i + diff])
 break;
 }
 // if we successfully got through the previous loop then our current
 // index is good.
 if (i == t->index) {
 t->index++;
 break;
 }
 // otherwise we just try the next index
 } while (t->index);
 }
 }
 // unreachable
 return -1;
}
answered May 21, 2016 at 18:05
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.