ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
1271474 Топик полностью
IBAH (28.12.2022 15:40, просмотров: 320) ответил Nikolaev_Aleksey на Поделитесь опытом, как нужно делать обработку данных от gsm (AT команды). И как это привязать к автомату состояний.
чего думать прыгать надо, 

Слои ПО

1) Прием-передача по УАРТ через кольцевой буфер, прием-передача не блокирующие!!! функция GetAT_GET(), возвращает 0 если нет данных

2) автомат чтения строки ограниченой CRLF

3) автомат посылки команд

автомат чтения строки


*

//стартовать считывание результата ATкоманды

void StartGetATKomand(void)

{

CRLFsost=0;

TimeStart=TimingDelay;//запомнить время

SostGetAT=GetATSostBusy;//установить состояние

GetAT_Clear();//очистка приемного буфера

return;//The End

}

///////////////////////////////////////////////////////////////////////////////

//считывание одной строки результата ATкоманды

void Get1ATKomand(unsigned char* str, unsigned long Timout)

{

static unsigned char PrevSimvol;//предыдущий принятый символ

static unsigned char UkKomand;//указатель строки считаной команды

if(SostGetAT==GetATSostBusy)

{//рабочий режим

if(TimingDelay >= (TimeStart+Timout))

{//истек таймаут

SostGetAT=GetATSostError;//ошибка

return;

}

unsigned char Simvol;

if(CRLFsost==0)

{//ожидаем приема <CR><LF>

while(1)

{

Simvol=GetAT_GET();

if(Simvol==0)return;

if(PrevSimvol==ASCII_CR_0D && Simvol==ASCII_LF_0A)

{

UkKomand=0;//сбрасываем указатель принятой команды

CRLFsost=1;//пеключаем состояние считывания

break;

}

PrevSimvol=Simvol;

}

}//end if(CRLFsost==0)

if(CRLFsost==1)

{//приниманием строку

while(1)

{

Simvol=GetAT_GET();

if(Simvol==0)return;

if(Simvol==ASCII_CR_0D)

{

CRLFsost=2;

break;

}

str[UkKomand]=Simvol;

UkKomand++;

}

}//end if(CRLFsost==1)

if(CRLFsost==2)

{//ожидаем завершения команды

Simvol=GetAT_GET();

if(Simvol==0)return;

if(Simvol==ASCII_LF_0A)

{

str[UkKomand]=0;

SostGetAT=GetATSostComplit;

}

} //end if(CRLFsost==2)

} //end if(SostGetAT==GetATSostBusy)

//The End

return;

}



*