Очень просто. Примерно так-же как описал megajohn только с маленькой поправкой. В потоке который читает порт обрабатываем только необходимые незапрашиваемые коды и стандартные ответы, для обработки ответов спецефических для консретной команды добавляем указатель на функцию обработчик. В итого получаем примерно так:
Код
void *p_data = NULL;
void (*p_func)(char*, void*) = NULL;
BOOL buffer[BUFFER_SIZE+1];
void Parcer(char *buff)
{
if(strcmp(buf, "OK")==0){....}
else if(strcmp(buf, "ERROR")==0){....}
else if(strncmp(buf, "+CME ERROR", 10)==0){....}
........................................................
else if(p_func)if(p_func(buf, p_data)) p_func = NULL;//Тут обрабатываем спецефические ответы
}
BOOL csq_cb(char *buf, void *p)
{
int *res = (int*)p;
if(strncmp(buf, "+CSQ", 4)
{//Обрабатываем ответ +CSQ.....
.....................
res=xxxx;
return TRUE;
}
return FALSE;
}
int GetCSQ()
{
int res = -1;
p_data = &res;
p_func = csq_cb;
if(PutCommand("AT+CSQ", 1000)==OK_RES)//Отправляем команду AT+CSQ и ждем ответа OK или ERROR
{
p_func = NULL;
return res;
}
p_func = NULL;
return -1;
}