Jump to content

    

ISG2015

Участник*
  • Content Count

    33
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ISG2015

  • Rank
    Участник

Recent Profile Visitors

407 profile views
  1. Трудно в вами не согласиться. Спасибо!
  2. p_kav, а я однако за STATUS совсем не слежу:( Нужно разбираться с этим делом ,конечно не годится никуда рвать сессии и потом иметь неприятности с опером.
  3. 3. Еще не совсем понимаю почему модем подключается к GPRS с неправильным APN!? о_О Как тарифицируется все если я неправильно указал APN?
  4. Да, вы правы, что то не так в таком подходе. Тогда помогите разобраться с тем как: 1. Правильно завершить сессию GPRS (UDP)? Сейчас я выполняю AT+CIPSHUT и жду ОК. Но на форуме читал что ОК может и прийти а сессия еще "висеть". 2. Как запарковать правильно модем? Ведь даже если я буду перегружать модем в исключительных ситуациях, тогда, когда уже ничего другое не помогает, то как бы нужно правильно его подготовить к аппаратному (по-питанию) перегрузу! А вот что угодно: при попытке подключиться на любую из команд ERROR - перезагрузка, при отправке пакета получили ERROR или PDP DEACT - перезагрузка.
  5. Идея была в том ,что при любой коллизии в GPRS линке - просто перегружать модем аппаратно. Не вдаваясь в подробности так сказать. Если у меня модем подключается к GPRS за 18с то мне легче и проще перегружать все сразу.
  6. 1. Подскажите, что если модем SIM900R часто аппаратно перегружается? Ну например в среднем один раз в час. Как это отразится на его работоспособности? Устройство работает круглосуточно, период эксплуатации 5-10 лет. 2. Как правильно "запарковать" модем перед аппаратным перегрузом? Нужно ли предварительно "powerkey" тискать? Обязательно ли за status-ом посматривать? 3. И как таки правильно закрыть GPRS (UDP сессия) ? Сейчас я делаю "AT+CIPSHUT" и жду "SHUT OK" 4. Часто ловлю ERROR на +CSTT= "internet". После "SHUT OK" предыдущей сессии проходит около 18с. Со второй попытки конектится. Спасибо!
  7. Спасибо! UDP выбрали для сокращения трафика. Буду вникать.
  8. Доброго времени! Пилю проект с модемами SIM900R. Столкнулся с такой траблой: время от времени в открытой UDP сессии происходит смена номера порта. То есть, IP не меняется, а вот порт меняется. Так происходит если модем ничего не передает/принимает в течении приблизительно >8с. Это я так понимаю нормально? У меня устройство выходит на связь с сервером реже (30с). Сервер отмечает у себя текущий слот с которого обратился модем. К тому времени когда мне необходимо обратится к модему/устройству данные по слоту(порту) устаревают. Получается мне необходимо все время поддерживать линк отправкой/получением пакета только для того чтоб менялся порт слота? Спасибо!
  9. Если с инициализацией, то это на этапе компиляции? Если так то это не совсем то что нужно.
  10. Работает. Удобно по очереди вынимать и выполнять. По поводу расточительства верное замечание, изначально хотелось иметь повыше "разрешение" для установки таймаутов выполнения АТ команд.
  11. Есть массив указателей: static char * Commands[12][2] = { {"AT\r","1000"}, {"ATE0\r","1000"}, {"AT+CPIN?\r","1000"}, {"AT+CREG?\r","1000"}, {"AT+CGATT?\r","1000"}, {"AT+CIPSHUT\r","1000"}, {"AT+CIPSTATUS\r","1000"}, {"AT+CIPMUX=0\r","1000"}, {"AT+CSTT=\"internet\"\r,"5000"}, {"AT+CIICR\r","5000"}, {"AT+CIFSR\r","5000"}, {"AT+CIPSTART= \"UDP\" , \"210.286.252.161\", \"14000\"\r","5000"} }; Инициализируется на старте программы. Могу ли я изменить информацию на которую ссылаются указатели на этапе исполнения программы? Не улавливаю где располагает компилятор отдельные строки ,как их там хранит и есть ли возможность что-то менять. Спасибо!
  12. Все именно так. Я хотел было поправить сообщение, но поленился. Меня подвело то, что я в IAR пользовался этим кодом и там работал UART с такой инициализацией. С WinAvr такой номер не прокатил так как вероятнее нет чего то типа reti из прерываний описанных по умолчанию где то в пучинах IAR. Самое главное ,что я понял как важно быть внимательным и не тупить на ровном месте:)
  13. Разобрался. Оказывается не устраивал компилятор подход к инициализации UART UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<UDRIE1)|(1<<RXCIE1);//|(1<<TXCIE1); Заремил "|(1<<TXCIE1)" и все поехало. Пришлось весь проект перепахать:) Спасибо!
  14. Код UART /* ******************************************************************************** * GLOBAL FUNCTION ******************************************************************************** */ INT08U UART_RxBuf[uART_RX_BUFFER_SIZE]; volatile INT08U UART_RxHead; volatile INT08U UART_RxTail; INT08U UART_TxBuf[uART_TX_BUFFER_SIZE]; volatile INT08U UART_TxHead; volatile INT08U UART_TxTail; INT08U UARTDataInReceiveBuffer (void) { INT08U temp1 = UART_RxHead, temp2 = UART_RxTail; return (temp1 != temp2); } INT08U UARTReceiveByte (void) { INT08U temp=UART_RxHead; INT08U tmptail; while (temp == UART_RxTail) { temp = UART_RxHead; }; tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK; UART_RxTail = tmptail; return UART_RxBuf[tmptail]; } void UARTTransmitByte (INT08U data ) { INT08U tmphead; tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK; while ( tmphead == UART_TxTail ); UART_TxBuf[tmphead] = data; UART_TxHead = tmphead; UCSR1B |= (1<<UDRIE1); } /* ******************************************************************************** * LOCAL FUNCTION ******************************************************************************** */ ISR(USART1_RX_vect) { INT08U data; INT08U tmphead; data = UDR1; tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK; UART_RxHead = tmphead; if (tmphead == UART_RxTail) { /* ERROR! Receive buffer overflow */ } UART_RxBuf[tmphead] = data; } ISR(USART1_UDRE_vect ) { INT08U temp1 = UART_TxHead, temp2 = UART_TxTail; INT08U tmptail; if (temp1 != temp2) { tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK; UART_TxTail = tmptail; UDR1=UART_TxBuf[tmptail]; } else { UCSR1B &= ~(1<<UDRIE1); } } Код "перенаправления" вывода // прототип функции вывода символа int my_putchar(char c, FILE *stream); // определяем дескриптор для стандартного вывода FILE mystdout = FDEV_SETUP_STREAM( my_putchar, // функция вывода символа NULL, // функция ввода символа, нам сейчас не нужна _FDEV_SETUP_WRITE // флаги потока - только вывод ); // функция вывода символа int my_putchar(char c, FILE *stream) { UARTTransmitByte(c); return 0; } Код я перетащил из старого IAR проекта в WINAVR. Так нужно было. Если "printf" вызываю из main - ок. Если из других модулей - перегружается проц. Просто не понимаю даже куда смотреть. Спасибо за советы. Не ясно еще как память посмотреть. Может быть я что то навтыкал с оперативой/стеком/кучей.. В IAR я просто в настройках проекта менял границы этих областей и иногда все разруливалось. Что делать в WinAVR совсем не понимаю.
  15. Да. Спасибо. По поводу ответов модема: здорово что обрамляются с 2х сторон 0x0D 0x0A, это и правда замечательно! Я только не совсем понял почему для одной из команд в ответе нет "ОК" :) Хорошо, это не главная часть ракеты так сказать, разберемся.