ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
2 мая
1265394 Топик полностью
Nikolay801_ (05.12.2022 12:15, просмотров: 160) ответил =AlexD= на Совершенно не могу понять, почему atc->searchCmd[] не заполняется в вызывающей функции? Зачем такой изврат с переменным количеством аргументов?
Рациональных объяснений этому нет. 

я посмотрел, там везде в этих вариабельных параметрах неизменяемые строки, можно использовать указатели на них без создания копий в динамически выделяемой памяти.

я бы сделал так

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;
}
Будь ты проклят, Перри-Утконос!