2016-04-19 4 views
3

Я использую Atmega32 и sim900 для проекта. Я продолжаю отправлять команду «AT» и ждать ответа «ОК», но все, что я получаю, это AT \ r \ n. Я проверил и перепроверял проводку и скорость передачи в бодах, но до сих пор ничего не получаю. Независимо от того, что я отправляю на sim900, я получаю только эхо обратно той же переданной строки.Sim900 только echos назад команды- Нет ответа

Может ли кто-нибудь мне помочь? Я бы очень признателен.

Я отправляю мой код здесь:

int sim900_init(void) 
{ 
    while(1) 
    { 
    sim_command("AT"); 
    _delay_ms(2000); 
    } 
return 0; 
} 

void usart_init(void) 
{ 
/************ENABLE USART***************/ 
    UBRRH=(uint8_t)(MYUBRR>>8); 
    UBRRL=(uint8_t)(MYUBRR);       //set baud rate 
    UCSRB=(1<<TXEN)|(1<<RXEN);    //enable receiver and transmitter 
    UCSRC=(1<<UCSZ0)|(1<<UCSZ1)|(1<<URSEL); // 8bit data format 

    UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC) 

/***************FLUSH ALL PRIVIOUS ACTIVITIES********************/ 

    flush_usart(); 

/*********APPOINT POINTERS TO ARRAYS********************/ 

    command=commandArray;  // Assigning the pointer to array 
    response=responseArray;  //Assigning the pointer to array 

/*****************ENABLE INTRUPT***************************/ 
sei();       //Enabling intrupts for receving characters 
} 


void flush_usart(void) 
{ 
    response_full=FALSE;  //We have not yet received the 
} 

void transmit_char(unsigned char value) 
{ 
    while (!(UCSRA & (1<<UDRE)));   // wait while register is free 
    UDR = value; 
} 

void sim_command(char *cmd) 
{ 
    int j=0; 
    strcpy(command,cmd); 
    while(*(cmd+j)!='\0') 
    { 
     transmit_char(*(cmd+j)); 
     j++; 
    } 
    transmit_char(0x0D); // \r     // after all the at commands we should send \r\n so, we send it here after the string 
    transmit_char(0x0A); // \n 

} 

unsigned char recieve_char(void) 
{ 
    char temp; 
    while(!(UCSRA) & (1<<RXC));   // wait while data is being received 
    temp=UDR; 
    LCDdata(lcdchar,temp); 
    return temp; 
} 

void recive_sim900_response(void) 
{ 
    static int i=0; 
    char temp; 
    temp=recieve_char(); 

    if(temp!='\n' && temp!='\r')  // We dont want \r \n that will be send from Sim so we dont store them 
    *(response+i)=temp; 

     if(i==8)     //when null char is sent means the string is finished- so we have full response 
     {        //we use them later in WaitForResponse function. we wait until the full response is received 
      i=0;          
      response_full=TRUE; 
     } 
     else 
      i++; 
} 
+0

В коде, который вы показываете, вы никогда не называете 'recive_sim900_response()' или что-то еще. (Несвязанный, но: действительно ли ваш буфер ответов ** 9 ** байтов?) – JimmyB

+0

'flush_usart()' также должен сбросить индекс в буфер (который теперь является 'static int i' внутри' recive_sim900_response() '.) – JimmyB

+0

Отсутствуют фигурные скобки после 'if (temp! = '\ N' && temp! = '\ R')'. – JimmyB

ответ

0

Вы были единственным, кто имел точно такую ​​же проблему, как И.

как-то библиотеки из gsmlib.org работал, но ввод AT команды напрямую использование серийного монитора Arduino с использованием Arduino в качестве моста или просто FTDI.

Причина в том, что, по-видимому, SIM900 ожидает, что команды заканчиваются символом '\ r'. Я нашел это, попробовав GTKTerm, который работал.

Если ввести «AT» и нажав клавишу ввода в GTKTerm, что на самом деле отправляется в «AT», а затем дважды «\ г» (0x0D) и один 0x0A

0

модулем по умолчанию GSM находится в эхо назад ON режиме. И вам нужно изменить свою команду.

sim_command("AT"); 

вам нужно Enter = CR/LF после команды так изменить свой код, как это и дать попробовать

sim_command("AT\r"); 

И в случае, если вы хотите отключить эхо обратно команды вы посылаете, то вы должны отправьте эту команду, как только у вас появится ответ OK для команды AT.

sim_command("ATE0\r"); //Echo back OFF 
sim_command("ATE1\r"); //Echo back ON 
Смежные вопросы