Hola a todos estoy tratando de interfaz GSM SIM900 con atmega32. He escrito un código en el que si un usuario pulsa un botón, puede hacer una llamada a un pre número definido. Si queremos cambiar el pre número definido, podemos enviar mensaje como CHANGE1234567890 donde 1234567890 es el nuevo número, así que si alguien presiona el botón, la llamada se hará en este nuevo número.
En mi código me han hecho serial_Tx
función que enviar cadena en serie. serial_Rx
que reciben los datos, y uart_put
que transmitir un único 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***********************************//
}
}
Soy capaz de conseguir el número de la ranura de mensaje recibido y también he extraído el número de mi msg. El problema es que ahora tengo que reemplazar el antiguo número con un nuevo número en call function
, pero no su trabajo correctamente y de que incluso cuando me oprime el botón de no función. Por favor, ayudar.