Arduino Serial Find in Mbed
Page last updated 10 Nov 2017, by
0
replies
.
#include "mbed.h" Serial pc(USBTX, USBRX); /** * Arduino's Serial#Find method (https://www.arduino.cc/en/Serial/Find) adopted to Mbed OS. * Does not allocate buffers inside. * * Example (finding the string 'ready' in a stream): * Serial uart(D1, D0); * uart.baud(115200); * * bool found = serial_find(&uart, "ready", 10); * printf("Found it? %d\n", found) * * @param serial Pointer to an initialized UART Serial object * @param str_to_find String to find in the UART stream * @param timeout_s Timeout in seconds * @returns True if found, false if timed out */ static bool serial_find(Serial *serial, const char *str_to_find, uint32_t timeout_s) { // Use RTC (instead of interrupt) for timeout detection time_t curr = time(NULL); bool is_partial_match = false; uint16_t match_ix = 0; size_t str_to_find_len = strlen(str_to_find); while (1) { // timeout detection if (time(NULL) - curr > timeout_s) return false; while (serial->readable()) { // also do timeout detection here... if (time(NULL) - curr > timeout_s) return false; char c = serial->getc(); if (!is_partial_match) { // Find the first character in the stream if (c == str_to_find[0]) { if (str_to_find_len == 1) return true; match_ix = 1; is_partial_match = true; } continue; } // is_partial_match is correct, check remaining characters if (c == str_to_find[match_ix]) { if (str_to_find_len == match_ix + 1) return true; match_ix++; } else { // not a match anymore, continue is_partial_match = false; } } } return false; } int main() { pc.baud(115200); pc.printf("Hello world\n"); // set up connection over UART, e.g. to ESP8266 WiFi module... Serial uart(D1, D0); uart.baud(115200); bool found = serial_find(&uart, "ready", 10); printf("Found it? %d\n", found); }
Please log in to post comments.