boolean sim900_wait_for_resp(const char* resp, DataType type, unsigned int timeout, unsigned int chartimeout) { int len = strlen(resp); int sum = 0; unsigned long timerStart, prevChar; //prevChar is the time when the previous Char has been read. timerStart = millis(); prevChar = 0; while(1) { if(sim900_check_readable()) { char c = serialSIM900->read(); DEBUG("-"); DEBUG(c); prevChar = millis(); sum = (c==resp[sum]) ? sum+1 : 0; if(sum == len)break; } if ((unsigned long) (millis() - timerStart) > timeout * 1000UL) { return false; } //If interchar Timeout => return FALSE. So we can return sooner from this function. if (((unsigned long) (millis() - prevChar) > chartimeout) && (prevChar != 0)) { return false; } } //If is a CMD, we will finish to read buffer. if(type == CMD) sim900_flush_serial(); return true; }
int sim900_wait_readable (int wait_time) { unsigned long timerStart; int dataLen = 0; timerStart = millis(); while((unsigned long) (millis() - timerStart) > wait_time * 1000UL) { delay(500); dataLen = sim900_check_readable(); if(dataLen > 0){ break; } } return dataLen; }
void sim900_read_buffer(char *buffer, int count, unsigned int timeout, unsigned int chartimeout) { int i = 0; unsigned long timerStart, prevChar; timerStart = millis(); prevChar = 0; while(1) { while (sim900_check_readable()) { char c = serialSIM900->read(); prevChar = millis(); buffer[i++] = c; if(i >= count)break; } if(i >= count)break; if ((unsigned long) (millis() - timerStart) > timeout * 1000UL) { break; } //If interchar Timeout => return FALSE. So we can return sooner from this function. Not DO it if we dont recieve at least one char (prevChar <> 0) if (((unsigned long) (millis() - prevChar) > chartimeout) && (prevChar != 0)) { break; } } }
int GPRS::readable(void) { return sim900_check_readable(); }
void sim900_flush_serial() { while(sim900_check_readable()){ serialSIM900->read(); } }