Hi there
For test purposes, I first implemented a simple serial reading & parsing function in polling mode of a gps device (sending @ 1 Hz).
void read_gps_tag(void) { uint8_t cnt = 0; char uart_buf[GPS_NMEA_MAX_SIZE]; // Read UART buffer char c; // Read UART character ret_code_t ret; // Return value of the nrf_serial_read function bool reading = true; // Reading flag char *p_str; // Pointer on the string comparison result while(reading) { ret = nrf_serial_read(&gps_uart, &c, sizeof(c), NULL, 1000); APP_ERROR_CHECK(ret); uart_buf[cnt++] = c; if(c == GPS_NMEA_STOP_CHAR) { if(uart_buf[0] == GPS_NMEA_START_CHAR) { static char comp[7] = "$GPRMC"; p_str = strstr(uart_buf, comp); if(p_str != NULL) { strcpy(cur_tag.raw_tag, uart_buf); cur_tag.length = strlen(uart_buf); reading = false; } } cnt = 0; } } }
Everything works fine when I call the function directly from the main(), e.g. like:
int main (void) { // ...initializations... while(true) { read_gps_tag(); } }
But when I embed the function in the following code, it keeps stuck on reading
int main(void) { // ...initializations... while (true) { if(ui_rec_start_req) { NRF_LOG_INFO("Start request received"); card_status = sdc_init(); if(card_status == RES_OK) { NRF_LOG_INFO("SD card init done."); ff_result = sdc_mount(); if(ff_result == FR_OK) { NRF_LOG_INFO("SD card mounted."); read_gps_tag(); } else { NRF_LOG_INFO("SD card init failed. Result: %d", ff_result); ui_sdc_init_cnt++; } } else { NRF_LOG_INFO("SD card check failed. Status: %d", card_status); ui_sdc_init_cnt++; } if(ui_sdc_init_cnt >= 3) { ui_rec_start_req = false; } } } }
For information: the 'ui_rec_start_req' flag is set by interruption when a button is pressed. Everything works basically fine, except 'read_gps_tag' which stays stuck at 'nrf_serial_read(&gps_uart, &c, sizeof(c), NULL, 1000)'. Any idea?
Thanks in advance,
Sébastien