Кто просвятит

MDV
Offline
Зарегистрирован: 08.08.2013

Коллеги просвятите юзера.

Есть библиотека в ней есть ряд комманд

например отключение модема:

s8 GSMClass::PowerOFF()
{
 GSM.WriteStr_P(PSTR("AT\r\n"));
 _delay_ms(500);
 UART0_rx_reset( );  
 UART0_setSearchString( OK_ );
 GSM.WriteStr_P(PSTR("\r\nAT$POWEROFF\r\n"));
 UART0_rx_on( );
 if( UART0_check_acknowledge( 256 ) > 0 )
 {
  return 1;
 }  
 else return -1;
}

в моём случае вместо ответа ОК приходит другой "NORMAL POWER DOWN"  но конструкция

s8 GSMClass::PowerOFF()
{
 GSM.WriteStr_P(PSTR("AT\r\n"));
 _delay_ms(500);
 UART0_rx_reset( );  
 UART0_setSearchString( NORMAL_POWER_DOWN_ );
 GSM.WriteStr_P(PSTR("\r\nAT+CPOWD\r\n"));
 UART0_rx_on( );
 if( UART0_check_acknowledge( 256 ) > 0 )
 {
  return 1;
 }  
 else return -1;
}

не работает.

не могу понять алгоритм работы в строках

UART0_setSearchString( OK_ ); вроде должна задавать какой ответ ждать из порта и

if( UART0_check_acknowledge( 256 ) > 0 ) вроде как таймер, но не уверен.

ниже сами подпрограммы:

//! Флаги переполнения и подтверждения

volatile u8 rx_overflow, rx_ack;

void UART0_setSearchString( unsigned char Response )
{
    UCSR0B &= ~( 1 << RXCIE0 );
 searchFor = (const char*)pgm_read_word(&searchStrings[Response]);
    searchStr = Response;
    rx_i = 0;
}

 

 

 

s8 UART0_check_acknowledge( u16 pause )
{
    //! Local variables
    static u16 i, ii;

    for( i = 0; ( rx_ack == 0 ) && ( i < 65535 ); i++ ) //Цикл ожидания
    {
        for( ii = 0; ii < pause; ii++ )
        {
            asm("nop"); // Тратим энергию в пустую
        }
    }

    if( rx_ack > 0 ) 
    {
        rx_ack = 0; 
        return 1;
    }

    else
    {
        UART0_rx_off( );
        UART0_rx_reset( );
        return 0;
    }
}

подскажите куда копать?

 

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

MDV пишет:

подскажите куда копать?

Из ваших кусков кода и непонятных выводов, кроме вас этого знать никто не может. 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Когда пишите "Есть библиотека", то ссылочку на нее указать надо, тогда хотя бы понятней в какую сторону копать. Я хоть с GSM дела не имел, но не думаю, что это всего одна единственная либа на эту тему.

А так ответ простой, копать нужно вглубь

MDV
Offline
Зарегистрирован: 08.08.2013

ссылка на либу

https://github.com/jt5/GSM

по поводу копать глубже, хотелось бы знать где? 

com
Offline
Зарегистрирован: 06.09.2013

MDV пишет:

по поводу копать глубже, хотелось бы знать где? 

начните копать в сторону уточнения, чего вы хотите получить и что именно не работает - телепатов нет.

но на мой взгляд по диагонали ваш код не только работать (хотя бы и неправильно) не будет, но даже не скомпилируется

UART0_setSearchString( NORMAL_POWER_DOWN_ );

т.к константа NORMAL_POWER_DOWN_ нигде не определена, смотрим исходник gsm.cpp

 

#define OK_ 0
#define RING_ 1
#define CLIP_ 2
#define CRLF_ 3
#define MORE_ 4
#define CPIN_        5
#define CGATT_        6
#define CMTI_        7
#define CMGR_        8
 
вы ее сами придумали?
com
Offline
Зарегистрирован: 06.09.2013

попытаюсь поработать телепатом

вы думаете, что ОК_ означает поиск строки "ОК", а NORMAL_POWER_DOWN_ соответсвенно, строку "NORMAL POWER DOWN"?

это не так

MDV
Offline
Зарегистрирован: 08.08.2013

константу естественно задал. прога компилируется но не работает. вся затея от того что у моего модема и запросы и ответы несколько другие.

исправленный код смогу выложить только вечером, так как не знаю как здесь прилепить файл

com
Offline
Зарегистрирован: 06.09.2013

классический разговор глухого со слепым

MDV пишет:

не работает.

com пишет:

что именно не работает - телепатов нет.

MDV пишет:

прога компилируется но не работает

MDV
Offline
Зарегистрирован: 08.08.2013

Согласен тяжело понять ход чужих мыслей. Поробую более понятно.
Есть библиотека написанная для модема ни чипе М33 в силу обстоятельств переписываю её под модем на чипе SIM900.Часть АТ комманд и ответов на них разная. В примере отвктом на команду выключения модема возвращается ОК в моём случае normal power down. Результатом в случае удачного ответа на АТ команду является присвоение функции PowerOFF значения 1. В моём случае это не происходит.

com
Offline
Зарегистрирован: 06.09.2013

понятно. хлебом не корми, дай впихнуть невпихуемое :)

а можно не по теме, но принципиальный вопрос - почему не исмпользуете библиотекой специально для sim900?

MDV
Offline
Зарегистрирован: 08.08.2013

В той которую нашел нет подпрограммы работы с tcp socket-ом. От этого и мучения

maksim
Offline
Зарегистрирован: 12.02.2012

Примерно процентов на сто уверен, что все там есть, иначе бы этот модуль не подключался по tcp.

MDV пишет:
подпрограммы работы с tcp socket-ом

Что вы конкретно подразумиваете под этими словами?

MDV
Offline
Зарегистрирован: 08.08.2013

Отправку данных на сервер.

MDV
Offline
Зарегистрирован: 08.08.2013

Скиньте ссылку на либу где есть подпрограммы работы с соккетом и выключенения модема

maksim
Offline
Зарегистрирован: 12.02.2012

Первая же ссылка в гугле sim900 library умеет устанавливать tcp подключение к серверу и отправлять данные. А как отключать почитайте даташит