Кто просвятит
- Войдите на сайт для отправки комментариев
Пнд, 04/11/2013 - 18:44
Коллеги просвятите юзера.
Есть библиотека в ней есть ряд комманд
например отключение модема:
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; } }
подскажите куда копать?
подскажите куда копать?
Из ваших кусков кода и непонятных выводов, кроме вас этого знать никто не может.
Когда пишите "Есть библиотека", то ссылочку на нее указать надо, тогда хотя бы понятней в какую сторону копать. Я хоть с GSM дела не имел, но не думаю, что это всего одна единственная либа на эту тему.
А так ответ простой, копать нужно вглубь
ссылка на либу
https://github.com/jt5/GSM
по поводу копать глубже, хотелось бы знать где?
по поводу копать глубже, хотелось бы знать где?
начните копать в сторону уточнения, чего вы хотите получить и что именно не работает - телепатов нет.
но на мой взгляд по диагонали ваш код не только работать (хотя бы и неправильно) не будет, но даже не скомпилируется
UART0_setSearchString( NORMAL_POWER_DOWN_ );
т.к константа NORMAL_POWER_DOWN_ нигде не определена, смотрим исходник gsm.cpp
попытаюсь поработать телепатом
вы думаете, что ОК_ означает поиск строки "ОК", а NORMAL_POWER_DOWN_ соответсвенно, строку "NORMAL POWER DOWN"?
это не так
константу естественно задал. прога компилируется но не работает. вся затея от того что у моего модема и запросы и ответы несколько другие.
исправленный код смогу выложить только вечером, так как не знаю как здесь прилепить файл
классический разговор глухого со слепым
не работает.
что именно не работает - телепатов нет.
прога компилируется но не работает
Согласен тяжело понять ход чужих мыслей. Поробую более понятно.
Есть библиотека написанная для модема ни чипе М33 в силу обстоятельств переписываю её под модем на чипе SIM900.Часть АТ комманд и ответов на них разная. В примере отвктом на команду выключения модема возвращается ОК в моём случае normal power down. Результатом в случае удачного ответа на АТ команду является присвоение функции PowerOFF значения 1. В моём случае это не происходит.
понятно. хлебом не корми, дай впихнуть невпихуемое :)
а можно не по теме, но принципиальный вопрос - почему не исмпользуете библиотекой специально для sim900?
В той которую нашел нет подпрограммы работы с tcp socket-ом. От этого и мучения
Примерно процентов на сто уверен, что все там есть, иначе бы этот модуль не подключался по tcp.
Что вы конкретно подразумиваете под этими словами?
Отправку данных на сервер.
Скиньте ссылку на либу где есть подпрограммы работы с соккетом и выключенения модема
Первая же ссылка в гугле sim900 library умеет устанавливать tcp подключение к серверу и отправлять данные. А как отключать почитайте даташит.