Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- angelocarrieri
- Date:
- 2018-05-11
- Revision:
- 4:87ec8f45cafe
- Parent:
- 3:1df7773ae017
- Child:
- 5:07e3997f4856
File content as of revision 4:87ec8f45cafe:
#include "mbed.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "Serial.h"
#include "ATCmdParser.h"
#include "UARTSerial.h"
//LocalFileSystem local("local");
// Dimensione massima del vettore MRxB
#define MRxBDIM 50
// Dimensione massima del vettore ARxB
#define ARxBDIM 200
// Numero di byte da inviare per l'accensione del led tramite il protocollo SPI
#define NumByte 16
// Configurazione della porta seriale del PC
Serial pc(USBTX, USBRX);
// Dichiarazione del LED di diagnostica
DigitalOut led(LED2);
// Configurazione della porta seriale UART
UARTSerial serial = UARTSerial(PA_9, PA_10);
ATCmdParser at = ATCmdParser(&serial, "\r\n");
// Configurazione dei parametri del protocollo SPI
SPI myspi(PA_7, PA_6, PA_5, NC);
// Vettore che conterrà i byte ricevuti in risposta al comando AT inviato
char MRxB[MRxBDIM];
// Vettore che conterrà i byte ricevuti in risposta all'invio automatico della sequenza di comandi AT
char ARxB[ARxBDIM];
// Vettore che conterrà i byte da trasmettere al led tramite il protocollo SPI
uint8_t Vled[NumByte];
// Dichiarazione del parametro temporale t
Timer t;
// Variabili globali
char c;
int i=0;
int j=0;
int E=0;
int R=0;
int ER=0;
int ERR=0;
int end=0;
volatile char input;
//char vett[10];
// Funzione per l'emissione di luce verde tramite il protocollo SPI
void LedGREEN();
// Funzione per l'emissione di luce rossa tramite il protocollo SPI
void LedRED();
// Funzione per lo spegnimento del led tramite il protocollo SPI
void LedOFF();
// Funzione per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta al comando digitato
void ERR1();
// Funzione per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta alla sequenza prestabilita di comandi
void ERR2();
// Funzione che legge la risposta del modem
void ReadModem();
// Funzione che esegue il reset dei vettori MRxB e ARxB
void Vreset();
int main()
{
start:
//FILE *flis;
// Configurazione del baud rate per la comunicazione col PC
pc.baud(9600);
// Configurazione dei parametri del protocollo SPI
myspi.format(16, 0);
myspi.frequency(3333333.3);
pc.printf("\r\n");
pc.printf(" PROGRAMMA PER L'INVIO DI COMANDI AT SU PORTA SERIALE\r\n");
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
pc.printf(" ----------------------------------------------------------------------------\r\n");
pc.printf(" | Premere il tasto 'i' per inserire un comando |\r\n");
pc.printf(" | Premere il tasto 'a' per l'invio automatico della sequenza di comandi |\r\n");
pc.printf(" | Premere il tasto 'r' per rinviare l'ultimo comando |\r\n");
pc.printf(" | Premere il tasto 't' per testare il tempo di risposta del modem |\r\n");
pc.printf(" | Premere il tasto 's' per riavviare il programma |\r\n");
pc.printf(" | Premere il tasto 'e' per uscire dal programma |\r\n");
pc.printf(" ----------------------------------------------------------------------------\r\n");
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
/**flis = fopen("/local/lista.txt", "r");
if((flis=fopen("/local/lista.txt","r"))==NULL)
{
printf("Impossibile aprire il file");
exit(0);
}
while(!feof(flis))
{
fgets(vett,1,flis);
i++;
printf("%c",vett[i]);
}*/
while(1)
{
Vreset();
input=pc.getc();
if((input=='i')||(input=='I'))
{
LedOFF();
pc.printf("Inserire un comando: ");
while(1)
{
char c = pc.getc();
pc.putc(c);
at.write(&c,1);
if(c=='\r')
{
goto esc1;
}
}
esc1:
pc.printf("\r\n\r\nRisposta:\r\n");
at.read(MRxB, MRxBDIM);
for(i=0;i<MRxBDIM;i++)
{
pc.printf("%c",MRxB[i]);
}
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
ERR1();
Vreset();
} // End if
if ((input=='a')||(input=='A'))
{
LedOFF();
pc.printf("...invio automatico della sequenza di comandi...");
pc.printf("\r\n");
pc.printf("\r\nRisposta:\r\n\r\n");
at.send("AT");
ReadModem();
at.send("AT+CSQ=?");
ReadModem();
at.send("AT+CSQ");
ReadModem();
at.send("AT+CREG=?");
ReadModem();
at.send("AT+GMI");
ReadModem();
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
} // End if
if ((input=='r')||(input=='R'))
{
LedOFF();
pc.printf("...rinvio dell'ultimo comando...");
pc.printf("\r\n");
pc.printf("\r\nRisposta:\r\n\r\n");
at.send("AT#/");
ReadModem();
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
} // End if
if ((input=='t')||(input=='T'))
{
LedOFF();
pc.printf("Inserire un comando per testare il tempo di risposta del modem: ");
while(1)
{
char c = pc.getc();
pc.putc(c);
at.write(&c,1);
if(c=='\r')
{
t.reset();
t.start();
goto esc2;
}
}
esc2:
printf("\r\n\r\n");
if (at.recv("AT")==true)
{
t.stop();
}
at.read(ARxB, ARxBDIM);
Vreset();
pc.printf("Tempo di risposta: %f secondi\r\n", t.read());
if (t.read()<1)
{
LedGREEN();
}
else
{
pc.printf("\r\nATTENZIONE: Tempo di risposta superiore ad 1 secondo\r\n");
LedRED();
}
pc.printf("________________________________________________________________________________\r\n");
pc.printf("\r\n");
} // End if
if ((input=='s')||(input=='S'))
{
LedOFF();
Vreset();
goto start;
}
if ((input=='e')||(input=='E'))
{
pc.printf("Il programma e' stato chiuso\n\r\n\r");
LedOFF();
exit(0);
}
} // End while
}
void ReadModem()
{
at.read(ARxB, ARxBDIM);
for(i=0;i<ARxBDIM;i++)
{
pc.printf("%c",ARxB[i]);
}
printf("\r\n");
ERR2();
Vreset();
}
void ERR1()
{
end=0;
E=0;
R=0;
ER=0;
ERR=0;
// Ciclo per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta al comando inviato
for(i=0;i<MRxBDIM;i++)
{
if(ERR==0)
{
if((MRxB[i])==' ') {goto jump1;}
if(E==0)
{
if ((MRxB[i])=='E')
{
end++;
E=1;
goto jump1;
}
}
if(ER==0)
{
if(E==1)
{
if((MRxB[i])=='R')
{
end++;
R=1;
ER=1;
goto jump1;
}
else
{
E=0;
end=0;
goto jump1;
}
}
}
if(R==1)
{
if((MRxB[i])=='R')
{
end++;
ERR=1;
goto jump1;
}
else
{
end=0;
E=0;
R=0;
ER=0;
}
}
} // End if(ERR==0)
jump1:
led=1;
} // End ciclo for
if(end==3)
{
LedRED();
}
else
{
LedGREEN();
}
}
void ERR2()
{
end=0;
E=0;
R=0;
ER=0;
ERR=0;
// Ciclo per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta alla sequenza prestabilita di comandi
for(i=0;i<ARxBDIM;i++)
{
if(ERR==0)
{
if((ARxB[i])==' ') {goto jump2;}
if(E==0)
{
if ((ARxB[i])=='E')
{
end++;
E=1;
goto jump2;
}
}
if(ER==0)
{
if(E==1)
{
if((ARxB[i])=='R')
{
end++;
R=1;
ER=1;
goto jump2;
}
else
{
E=0;
end=0;
goto jump2;
}
}
}
if(R==1)
{
if((ARxB[i])=='R')
{
end++;
ERR=1;
goto jump2;
}
else
{
end=0;
E=0;
R=0;
ER=0;
}
}
} // End if(ERR==0)
jump2:
led=1;
} // End ciclo for
if(end==3)
{
LedRED();
}
else
{
LedGREEN();
}
}
void Vreset()
{
// Reset del vettore MRxB
for(i=0;i<MRxBDIM;i++)
{
MRxB[i]='\0';
}
// Reset del vettore ARxB
for(j=0;j<ARxBDIM;j++)
{
ARxB[j]='\0';
}
}
void LedGREEN()
{
// Cicli per la configurazione del vettore Vled
for(i = 0; i <= 3; i++)
Vled[i]=204;
for(i = 4; i <= 7; i++)
Vled[i]=136;
for(i = 8; i <= 11; i++)
Vled[i]=136;
for(i = 12; i <= NumByte-1; i++)
Vled[i]=136;
// Ciclo per l'invio dei frame al led
for(j = 0; j < NumByte; j++)
myspi.write(Vled[j]);
}
void LedRED()
{
// Cicli per la configurazione del vettore Vled
for(i = 0; i <= 3; i++)
Vled[i]=136;
for(i = 4; i <= 7; i++)
Vled[i]=204;
for(i = 8; i <= 11; i++)
Vled[i]=136;
for(i = 12; i <= NumByte-1; i++)
Vled[i]=136;
// Ciclo per l'invio dei frame al led
for(j = 0; j < NumByte; j++)
myspi.write(Vled[j]);
}
void LedOFF()
{
// Cicli per la configurazione del vettore Vled
for(i = 0; i <= 3; i++)
Vled[i]=136;
for(i = 4; i <= 7; i++)
Vled[i]=136;
for(i = 8; i <= 11; i++)
Vled[i]=136;
for(i = 12; i <= NumByte-1; i++)
Vled[i]=136;
// Ciclo per l'invio dei frame al led
for(j = 0; j < NumByte; j++)
myspi.write(Vled[j]);
}