Сообщение от supercelt
|
То есть в прерывании набили в буфер первый байт и тут же его прочитали и так далее?. strstr
|
Можно тут же, можно (и лучше) читать в основной программе (или задаче, ели еcть RTOS). Модем штука медленная, поэтому можно не на каждый байт дёргаться, а на несколько - типа проверять буфер не чаще нескольких миллисекунд. И обрабатывать несколько байт за раз - это выгоднее чем на каждый байт дёргаться.
Сообщение от supercelt
|
Ещё возникает вопрос, как тогда таким методом проверить есть ли в буфере строка RING без функции strstr
|
Написать свою функцию приёма.
Сам писал похожее - функция искала несколько заданных строк сразу (строки задавались в зависимости от ожидаемых ответов модема). Когда одна из строк совпадала, поиск прекращался и принималось решение что делать дальше (в зависимости от того что нашлось).
Пример - посылаем A+7925xxxxxxxx;
может приёти в ответ CONNECT, BUSY и так далее:
Нажмите, чтобы открыть спойлер
case CONNECT:
ClearUARTBuffer();
// ATD
SendATD();
// number
i=0;
while (i‹ConnectNumberLength) {
WriteByteToUSARTTxBuffer(ConnectNumber[i]);i++;}
// CRLF
SendCRLF();
// загрузка шаблонов
LoadNoCarrier(0);
LoadConnect(1);
LoadOk(2);
LoadError(3);
LoadBusy(4);
LoadNoDialTone(5);
LoadNoAnswer(6);
SetTemplateQty(7);
PollingState++;
break;
case CONNECT+1:
// ожидание 'CONNECT' и 'NO CARRIER' и тп
if (TemplateData.FindFlag) {
// найден шаблон
TemplateData.FindFlag=0;
switch (TemplateData.TemlateNumber) {
case 0:
case 4:
case 5:
case 6:
case 3:
// NO CARRIER, BUSY
PollingState=MODEM_IDLE;
ModemCtrlData.ErrorCode=2;
break;
case 1:
// CONNECT
PollingState=MODEM_IDLE;
ModemCtrlData.ErrorCode=1;
break;
default:
break;
}
}
break;