Получение данных от SIM808 - PullRequest
       114

Получение данных от SIM808

0 голосов
/ 19 декабря 2018

Я пытаюсь использовать модуль SIM808, но у меня нет ответа даже после отправки только "AT".Я использую 5V / 2.5A AC / DC адаптер.Плата (ecb-v3.2) достаточно хорошо подключена, потому что два диода включены постоянно, а один мигает каждые три секунды.Я попробовал свой код UART, отправив и получив данные с компьютера на ПК, и это сработало.Я также попытался отобразить некоторые данные в разных частях моего кода, чтобы найти строку с ошибкой.Я думаю, что проблема заключается в цикле while, в котором я жду получения одного символа от модуля SIM808.Я пометил эту строку в коде (в функции UART_RxChar () ).Я использую два UART в своем коде, один для отправки данных между uC и ПК (канал 0 в коде) и второй для отправки данных между uC и SIM808 (канал 1), но я проверил обе версии на своем компьютере.Это мой код:

#define F_OSC 7372800UL
#define BAUD 115200
#define ubrr ((F_OSC/16/BAUD)-1)
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

void UART_TxString(char *string_ptr, uint8_t channel);

void UART_Init( uint8_t channel )
{
    if ( channel == 0)
    {
        /*Set baud rate */
        UBRR0H = (unsigned char)(ubrr>>8);
        UBRR0L = (unsigned char)ubrr;
        /*Enable receiver and transmitter */
        UCSR0B = (1<<TXEN0) | (1<<RXEN0);
        /* Set frame format: 8data, 1stop bit */
        UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
    }
    else
    {
        /*Set baud rate */
        UBRR1H = (unsigned char)(ubrr>>8);
        UBRR1L = (unsigned char)ubrr;
        /*Enable receiver and transmitter */
        UCSR1B = (1<<TXEN1) | (1<<RXEN1);
        /* Set frame format: 8data, 1stop bit */
        UCSR1C = (1<<UCSZ10)|(1<<UCSZ11);
    }
}

char UART_RxChar( uint8_t channel )
{

    if ( channel == 0 )
    {
        while((UCSR0A & (1<<RXC0))==0);   // Wait till the data is received
        return(UDR0);                    // return the received char
    }
    else
    {
        //Here is the problem. The condition in the loop is always true.
        while((UCSR1A & (1<<RXC1))==0);   // Wait till the data is received
        return(UDR1);                    // return the received char
    }

}
void UART_TxChar(char ch, uint8_t channel)
{
    if ( channel == 0)
    {
        while((UCSR0A & (1<<UDRE0))==0); // Wait till Transmitter(UDR) register becomes Empty
        UDR0 =ch;             // Load the data to be transmitted
    }

    else
    {
        while((UCSR1A & (1<<UDRE1))==0); // Wait till Transmitter(UDR) register becomes Empty
        UDR1 =ch;             // Load the data to be transmitted
        UART_TxChar(ch,0);
    }

}
void UART_TxString(char *string_ptr, uint8_t channel)
{
    while(*string_ptr)
    UART_TxChar(*string_ptr++, channel);
}
void UART_RxString(char *string_ptr, uint8_t channel)
{
    char ch;
    while(1)
    {
        ch=UART_RxChar(channel);    //Reaceive a char
        UART_TxChar(ch, channel);     //Echo back the received char
        if((ch=='\r') || (ch=='\n')) //read till enter key is pressed
        {                          //once enter key is pressed
            *string_ptr=0;          //null terminate the string
            break;                //and break the loop
        }
        *string_ptr=ch;              //copy the char into string.
        string_ptr++;                //and increment the pointer
    }
}

int main(void)
{
    UART_Init(0);
    UART_Init(1);
    initLCD();
    UART_TxString("\r\nstart", 0);

    while(1)
    {
        char ans[15] = "";
        DDRE = 0xff;
        UART_TxString("AT\r\n",1);
        DDRE = 0x00;
        UART_RxString(ans,1);
        _delay_ms(2000);
    }
}

Я также проверил все возможности отправки: AT\r", "AT\n", "AT\r\n", "AT\n\r.

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в том, что вы возвращаете полученный символ обратно в модуль SIM808 в строке

UART_TxChar (ch, channel);// Вывод обратно полученного символа

, это может привести к путанице в SIM808 и привести его в несогласованное состояние.

Попробуйте подключить модуль SIM808 к ПК и использовать для анализа CoolTerm ответ после стрельбы по AT-команде.

...