3

プロジェクトに Atmega32 と sim900 を使用しています。「AT」コマンドを送信し続け、「OK」応答を待ちますが、AT\r\n しか得られません。配線とボーレートをチェックして再チェックしましたが、まだどこにも行きません。sim900 に何を送信しても、送信された同じ文字列がエコー バックされるだけです。

誰でも私を助けてもらえますか?本当にありがたいです。

ここにコードを投稿しています:

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++;
}
4

2 に答える 2

1

私とまったく同じ問題を抱えていたのはあなただけでした。

どういうわけか gsmlib.org のライブラリは機能しましたが、Arduino をブリッジとして使用するか、単に FTDI を使用して Arduino シリアル モニターを使用して AT コマンドを直接入力しても機能しませんでした。

その理由は、明らかに SIM900 がコマンドが '\r' 文字で終わることを想定しているためです。機能するGTKTermを試してみて、これを見つけました。

GTKTerm で「AT」と入力して Enter キーを押すと、実際に送信されるのは「AT」で、その後に 2 回の '\r' (0x0d) と 1 つの 0x0a が続きます。

于 2016-08-02T13:45:36.987 に答える
0

デフォルトでは、GSM モジュールはエコー バック ON モードになっています。そして、コマンドを変更する必要があります。

sim_command("AT");

コマンドの後に Enter=CR/LF が必要なので、このようにコードを変更して試してみてください

sim_command("AT\r");

また、送信したコマンドのエコーバックをオフにしたい場合は、AT コマンドに対して OK 応答が返ってきたら、このコマンドを送信する必要があります。

sim_command("ATE0\r"); //Echo back OFF
sim_command("ATE1\r"); //Echo back ON
于 2016-08-04T03:45:48.170 に答える