Hola a todos, estoy tratando de conectar GSM SIM900 con atmega32. Tengo un código escrito en el que si un usuario presiona un botón, se realizará una llamada a un número predefinido. Si queremos cambiar el número predefinido, podemos enviar un mensaje como CHANGE1234567890 donde 1234567890 es el nuevo número para que si alguien presiona el botón, se realice la llamada a este nuevo número.
En mi código, he creado serial_Tx
una función que envía una cadena en serie. serial_Rx
que reciben datos y uart_put
que transmiten un solo carácter.
CÓDIGO:
//serial initialize
void serial_Init()
{
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
UBRRL = 51;
}
//serial transmission function
void serial_Tx(char *str)
{
for (unsigned int i=0;str[i]!=0;i++)
{
UDR=str[i];
while(!(UCSRA&(1<<UDRE)));
}
}
//serial transmission single char
void uart_put(char data)
{
while(!(UCSRA & (1<<UDRE)))
{
}
UDR=data;
}
//serial receive function
char serial_Rx()
{
while(!(UCSRA & (1<<RXC)))
{
}
return UDR;
}
char newnum[10];
char smscontent[200];
int len=0; ;
unsigned char slot;
char smscmd[16];
char delcmd[16];
char cfmcall[16];
char call[20];
char smsindi[14];
char data[15];
char calldata[10];
char confirmdata[10];
char deldata[10];
int main(void)
{
DDRA = 0x00;
DDRC = 0xFF;
PORTA = 0xFF;
PORTC = 0x00;
serial_Init();
PORTA=0xFF;
while(1)
{
//********FUNCTION TO GET SLOT NUMBER of received msg***********//
if (serial_Rx() != NULL)
{
//serial_Tx("done\n");
PORTC = 0x01;
for (int i=0;i<=14;i++)
{
data[i] = serial_Rx();
if(isdigit(data[i]))
{
//serial_Tx("enter\n");
PORTC = 0x02;
slot = data[i];
}
}
}
else
{
serial_Tx("nothing to read \n");
}
//**************LOOP END***********************//
//************FUNCTION TO SEND SMS COMMAND**********************//
uart_put(slot); //printing the SMS slot number
sprintf(smscmd,"AT+CMGR=%c\r\n",slot);
serial_Tx(smscmd);
for(int k =0; k<=200;k++)
{
smscontent[k] = serial_Rx();
uart_put(smscontent[k]);
}
//*****************LOOP END*******************************//
//***************FUNCTION TO EXTRACT NEW NUMBER*************//
for(int k =0;smscontent[k]!=NULL;k++) //smscontent[k]!=NULL
{
if (smscontent[k] == 'C')
{
if (smscontent[k+1] == 'H')
{
if (smscontent[k+2] == 'A')
{
if (smscontent[k+3] == 'N')
{
if (smscontent[k+4] == 'G')
{
if (smscontent[k+5] == 'E')
{
if(isdigit(smscontent[k+6]))
{
k=k+6;
serial_Tx("MATCH\n");
for (int i=0;i<=9;i++,k++)
{
newnum[i] = smscontent[k];
}
serial_Tx(newnum); // new number is stored in newnum
}
}
}
}
}
}
}
}
//*****************LOOP END******************************//
//*******************CALL function **********************//
if(PINA==0xFE) // if switch pressed then:
{
sprintf(call,"ATD%s;\r\n",newnum);
serial_Tx(call);
for(int j=0;j<=9;j++)
{
calldata[j] = serial_Rx();
}
if(strstr(calldata,"OK") != NULL)
{
for (int i = 0;i<=20;i++)
{
PORTC = 0x01; // led blink
_delay_ms(150);
PORTC = 0x00;
_delay_ms(150);
}
}
else
{
PORTC = 0x02; // led 2 on
}
}
//*************************LOOP END***********************************//
}
}
Puedo obtener el número de ranura del mensaje recibido y también extraje el número de mi mensaje. El problema es que ahora tengo que reemplazar el número anterior con el número nuevo, call function
pero no funciona correctamente e incluso cuando presiono el botón no funciona. Por favor ayuda.
Si tiene otro dongle UART a USB disponible, puede conectar su pin RX a su pin TX en su atmega32 para ver qué se está enviando realmente en el código que tiene (también necesita conectar el GND en su dongle a su sistema GND) . He visto que cuando uso un módulo SIM800 si trato de transmitir mientras el sistema está esperando para completar otro comando, simplemente ignorará ese comando o generará un error. También he visto problemas si envía demasiados comandos demasiado rápido.
Entonces, básicamente, ver lo que hace de manera controlada a través de otro UART realmente ayudará mucho a descubrir qué está pasando. Solo asegúrese de que su dongle UART esté esperando 3.3V o algo similar para que sus niveles lógicos se conecten al nivel lógico UART para el módulo atmega32 y SIM900.
Podría considerar hacer una función strcmp o usar una de una biblioteca en algún lugar en lugar de hacer lo que está haciendo con comparaciones de un solo carácter. La función strcmp es una función muy simple de hacer u obtener de algún lugar. No he comprobado toda la lógica de su matriz, pero con tantas matrices diferentes, es fácil cometer un error en su lógica. Otra cosa a mencionar es que tiene matrices que tienen una longitud de 10, pero luego su ciclo for usa <= 9 como su comparación. Esa es una mala práctica ya que los dos números deben seguirse por separado. Mejor #definir la longitud y el uso
Sector Kia
ana carolina
Pablo
PINA==0xFE
de si es la forma correcta de verificar un botón, ¿debe verificar que al menos algo debería haber sucedido?Sector Kia
DigitalNinja
chris stratton