Обсуждаем контроллеры компании Atmel.
Ответить

Re: Вопрос по программированию МК AVR

Пн авг 02, 2021 17:55:57

Доброго времени, вот что получилось.


char buff[160]; /* буфер для хранения ответов и сообщений */
char msg_location[60]; /*буфер для копирования*/
char status_flag = 0; /* для проверки любого нового сообщения */
volatile int buffer_pointer;
volatile int buffer_dannye;

/* Процедура ISR для сохранения ответов / нового сообщения */
ISR(USART_RXC_vect) {
buff[buffer_pointer] = UDR; /* скопировать UDR (полученное значение) в буфер */
buffer_pointer++;
status_flag = 1; /* флаг прихода нового сообщения */
}

void GSM_Balans_Msg() {
USART_SendString("AT+CUSD=1,\"#100#\"\r"); //AT_команда модулю, проверка баланса SIM
_delay_ms(4000);
time = 2;

while (1) {
if (buff[buffer_pointer] == '\r' || buff[buffer_pointer] == '\n') //*исключить "\ r \ n", который является началом строки */
{
buffer_pointer++;
} else
break;
}

if (strstr(buff, "+CUSD:")) //* "+CUSD:" чтобы проверить, получено ли сообщение "Balans_" * /
{

while (buff[buffer_pointer] != ',') {

buffer_pointer++;
}
buffer_pointer++;

buffer_dannye = 0;
while (buff[buffer_pointer] != '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye] = buff[buffer_pointer]; //Копируем смс для отправки после ввода символа '>'//
buffer_pointer++;
buffer_dannye++;

}
buffer_pointer++;


while (1) {
if (time == 2) {
buffer_pointer = 0;
char num[14] = {
"+79*********"
};
char sms_buffer[35];
sprintf(sms_buffer, "AT+CMGS=\"%s\"\r", num);
USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */

while (buff[buffer_pointer] != '>'); //Ждём символ '>' для отправки скопированной записи из буфера//

time = 0;
}

buffer_pointer = 0;

while (msg_location[buffer_dannye] != '\r') //Копия сообщение о балансе SIM из буфера//
{
buff[buffer_pointer] = msg_location[buffer_dannye]; //Возвращаем сообщение о балансе SIM из буфера// для
// отправки после ввода символа '>'
buffer_pointer++;
buffer_dannye++;

while (buff[buffer_pointer] != ',') {

buffer_pointer++;
}
buffer_pointer++;
while (1) {
if (buff[buffer_pointer] == '\r' || buff[buffer_pointer] == '\n') //*исключить "\ r \ n", который является
//началом строки */
{
buffer_pointer++;
} else
break;
}
while (buff[buffer_pointer + 4] != '\r') // +4 ,убрал лишние знаки(,15) после кавычек "Balance:0,95r", 15

{
USART_TxChar(buff[buffer_pointer]); //Отправляем сообщение о балансе SIM,на мобильный тел.
buffer_pointer++;
}
buffer_pointer++;

if (buff[buffer_pointer] != '\r') {
buffer_pointer = 0;
memset(buff, 0, strlen(buff));
USART_TxChar(0x1a);
PORTA |= (1 << 2);
time = 1;
break;
}

} //while( msg_location[buffer_dannye]!= '\r')
buffer_dannye++;

if (time == 1) {
break;
}

} //while(1)


} //if(strstr(buff,"+CUSD:"))


buffer_pointer = 0;
buffer_dannye = 0;
memset(buff, 0, strlen(buff));
memset(sms_buffer, 0, strlen(sms_buffer));
memset(msg_location, 0, strlen(msg_location));
status_flag = 0;
time = 0;
_delay_ms(1000);
PORTA &= ~(1 << 2);
return;
}

Причина почему не сохранялись данные:
нужно было крутануть оба счётчика.

while (buff[buffer_pointer] != '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye] = buff[buffer_pointer]; //Копируем смс для отправки после ввода символа '>'//
buffer_pointer++;
buffer_dannye++;

}
buffer_pointer++;

В железе ещё не проверял, в студии и протеусе ошибок нет, протеус к терминалу подключил через виртуальный ком порт.
В процессе отладки, выяснилось что нужно пробовать разные терминалы.
Пытаюсь научится, писать код компактно и чётко, ищу на эту тему обучалку, ST7FOX и slav0n, очень полезные ссылки.
Всем кто откликнулся спасибо!
Ответить