Рациональных объяснений этому нет. я посмотрел, там везде в этих вариабельных параметрах неизменяемые строки, можно использовать указатели на них без создания копий в динамически выделяемой памяти.
я бы сделал так
char* atc_searchAnswer_(atc_t *atc, uint8_t *foundIndex)
{
*foundIndex = 0;
for (uint8_t search = 0; search < _ATC_SEARCH_CMD_MAX; search++)
{
if (atc->searchCmd[search] == NULL)
break;
char *str = strstr((char*) atc->rxBuffer, atc->searchCmd[search]);
if (str != NULL)
{
*foundIndex = search + 1;
return str;
}
}
return NULL;
}
int8_t atc_command_(atc_t *atc, const char *command, uint32_t timeout_ms, char *answer, uint16_t answer_size, ...)
{
if (atc->inited == false)
return -1;
if (atc_lock(atc, timeout_ms) == false)
return -1;
if (answer != NULL)
memset(answer, 0, answer_size);
uint8_t foundIndex = 0;
va_list tag;
va_start(tag, answer_size);
for (uint8_t i = 0; i < _ATC_SEARCH_CMD_MAX; i++)
{
char *str = va_arg(tag, char*);
if(str == NULL)
break;
atc->searchCmd[i] = str;
}
va_end(tag);
atc_transmit(atc, (uint8_t*) command, strlen(command));
uint32_t start = HAL_GetTick();
while (HAL_GetTick() - start < timeout_ms)
{
atc_delay(1);
if (atc_available(atc))
{
atc_printf("[%s] %s", atc->name, (char* )atc->rxBuffer);
atc_search(atc);
char *found = atc_searchAnswer_(atc, &foundIndex);
if (found != NULL && answer != NULL)
strncpy(answer, found, answer_size);
atc_empty(atc);
if (found != NULL)
break;
}
}
for (uint8_t i = 0; i < _ATC_SEARCH_CMD_MAX; i++)
atc->searchCmd[i] = NULL;
atc_unlock(atc);
return foundIndex;
}
atc_t atc;
char buffer[128];
bool foo(void){
char str[20];
if (atc_command_(&atc, str, 1000 , NULL, 0, "\r\nOK\r\n", "\r\nERROR\r\n", NULL) != 1)
{
atc_printf("[GSM] msg_selectStorage() failed!\r\n");
atc_unlock(&atc);
return false;
}
sprintf(str, "AT+CMGR=%d\r\n", 0);
if (atc_command_(&atc, str, 5000, buffer, sizeof(buffer), "\r\n+CMGR:", "\r\nOK\r\n", "\r\nERROR\r\n", NULL) != 1)
{
atc_printf("[GSM] msg_read(%d) failed!\r\n", index);
atc_unlock(&atc);
return false;
}
return true;
}