![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Test CBS-GPIO
Dependencies: mbed
Fork of Amplificatore_bomboni_rev2 by
CBS-GPIO.cpp
- Committer:
- pinofal
- Date:
- 2018-07-27
- Revision:
- 8:a7257fd80953
File content as of revision 8:a7257fd80953:
// Tested : NUCLEO-F401RE NUCLEO-L476LG #include "mbed.h" #include<stdlib.h> // dimensione del pacchetto di comunicazione tra PC e uC #define PACKETDIM 64 // comando di Read GPIO #define READGPIO "Read-GPIO" // Definizione periferiche Serial pc(USBTX, USBRX); // User Button, LED DigitalIn myButton(USER_BUTTON); // Output di servizio sul LED2 della scheda NUCLEO DigitalOut myLed(LED2); // Output della NUCLEO e Input del DUT. Saranno inviati dal PC alla NUCLEO, nell'ordine in cui si trovano dichiarati di seguito DigitalOut myOut1(PA_13); DigitalOut myOut2(PA_14); DigitalOut myOut3(PA_15); // Input della NUCLEO e Output del DUT. Saranno inviati dalla NUCLEO al PC, nell'ordine in cui si trovano dichiarati di seguito DigitalIn myIn1(PA_8); //PA_8 PC_14 DigitalIn myIn2(PB_10); //PB_10 PC_15 DigitalIn myIn3(PB_4); //PB_4 PH_0 DigitalIn myIn4(PB_5); //PB_5 PH_1 DigitalIn myIn5(PB_3); //PB_3 PD_2 //DigitalIn myService(PB_3); // indice per i cicli int nIndex; // comando ricevuto dal PC attraverso la routine di gestione interrupt Rx // 1: read all GPIO // 2: write all GPIO volatile int nReadCmd=0; // stato degli input volatile int myIn1Status; volatile int myIn2Status; volatile int myIn3Status; volatile int myIn4Status; volatile int myIn5Status; //********************************************** // IRQ per la Rx su seriale //********************************************** void RxInterrupt(void) { // array per la ricezione dei messaggi da seriale char caRxPacket[PACKETDIM]; int nRxPacketSize; // pntatore al comando, nella stringa ricevuta sulla seriale char* cCmdPosition; // reset array contenente pacchetto ricevuto nIndex=0; for(nIndex=0;nIndex<PACKETDIM;nIndex++) { caRxPacket[nIndex]='\0'; } // ricevi caratteri su seriale, se disponibili nRxPacketSize =0; while((pc.readable())) { // acquisice stringa in input e relativa dimensione pc.scanf("%s", &caRxPacket); nRxPacketSize = strlen(caRxPacket); } // restituisce il comando ricevuto e la dimensione pc.printf("Command: %s\n\r",caRxPacket); pc.printf("PacketSize: %d\n\r",nRxPacketSize); // confronta il comando ricevuto con quello di Read GPIO nReadCmd = strcmp(caRxPacket, "ReadGPIO"); if(nReadCmd==0) { // rileva lo stato degli input e trasmettili al PC-HOST pc.printf("USER-BUTTON: %d\n\r",myButton.read()); // il primo input è lo User-Button per scopi di diagnostica // myIn1: se legge 0/1, trasmette lo stato al PC if(myIn1==1) { pc.printf("In1: 1\n\r"); } else { pc.printf("In1: 0\n\r"); } // myIn2: se legge 0/1, trasmette lo stato al PC if(myIn2==1) { pc.printf("In2: 1\n\r"); } else { pc.printf("In2: 0\n\r"); } // myIn3: se legge 0/1, trasmette lo stato al PC if(myIn3==1) { pc.printf("In3: 1\n\r"); } else { pc.printf("In3: 0\n\r"); } // myIn4: se legge 0/1, trasmette lo stato al PC if(myIn4==1) { pc.printf("In4: 1\n\r"); } else { pc.printf("In4: 0\n\r"); } // myIn5: se legge 0/1, trasmette lo stato al PC if(myIn5==1) { pc.printf("In5: 1\n\r"); } else { pc.printf("In5: 0\n\r"); } } else { // verifica se nel comando ricevuto si trova la stringa WriteGPIO cCmdPosition=strstr(caRxPacket, "WriteGPIO"); if(cCmdPosition != NULL) // se il comando ricevuto contiene WriteGPIO, procedi con l'analisi dei dati { // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output cCmdPosition = strtok(caRxPacket,"-"); cCmdPosition = strtok(NULL,"-"); pc.printf("Data: %s\n\r", cCmdPosition); // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED if(cCmdPosition[0]=='1') { // accendi LED e comunica al PC pc.printf("Led2: ON\n\r"); myLed = 1; } else { // spegni LED e comunica al PC pc.printf("Led2: OFF\n\r"); myLed = 0; } // Out1: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[1]=='1') { // accendi Out1 e comunica al PC pc.printf("Out1: ON\n\r"); myOut1 = 1; } else { // spegni Out1 e comunica al PC pc.printf("Out1: OFF\n\r"); myOut1 = 0; } // Out2: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[2]=='1') { // accendi Out2 e comunica al PC pc.printf("Out2: ON\n\r"); myOut2 = 1; } else { // spegni Out2 e comunica al PC pc.printf("Out2: OFF\n\r"); myOut2 = 0; } // Out3: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[3]=='1') { // accendi Out3 e comunica al PC pc.printf("Out3: ON\n\r"); myOut3 = 1; } else { // spegni Out3 e comunica al PC pc.printf("Out3: OFF\n\r"); myOut3 = 0; } } } } //********************************************** // IRQ per la Rx su seriale //********************************************** int main() { // array per la ricezione dei messaggi da seriale char caRxPacket[PACKETDIM]; int nRxPacketSize; // pntatore al comando, nella stringa ricevuta sulla seriale char* cCmdPosition; // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto //pc.baud(56000); // 57600 bps pc.baud(9600); // 9600 bps //pc.baud(19200); // 19200 bps //pc.baud(57600); // a questa velocità CVI sulla USB del PC perde dei dati //pc.baud(921600); // a questa velocità CVI sulla USB del PC perde dei dati // inizializza il LED myLed = 1; wait(1); myLed = 0; // configura il Button come input PullUp. Non premuto = 1, Premuto = 0; myButton.mode(PullUp); // configura gli input come PullUp. Aperto = 1; myIn1.mode(PullUp); myIn2.mode(PullUp); myIn3.mode(PullUp); myIn4.mode(PullUp); myIn5.mode(PullUp); //myService.mode(PullUp); // Attiva la IRQ per la RX su seriale pc.attach(&RxInterrupt,Serial::RxIrq); /* while (true) { if( (myIn1 == 1) && (myIn2 == 1) && (myIn3 == 1) && (myIn4 == 1) && (myIn5 == 1) ) { myLed = 1; } else { myLed = 0; } pc.printf("Status: %d %d %d %d %d\n\r",myIn1.read(), myIn2.read(), myIn3.read(), myIn4.read(), myIn5.read()); } */ // ciclo in cui attende interrupt while(true) { /* if(pc.readable()) { // reset array contenente pacchetto ricevuto nIndex=0; for(nIndex=0;nIndex<PACKETDIM;nIndex++) { caRxPacket[nIndex]='\0'; } // ricevi caratteri su seriale, se disponibili nRxPacketSize =0; while((pc.readable())) { // acquisice stringa in input e relativa dimensione pc.scanf("%s", &caRxPacket); nRxPacketSize = strlen(caRxPacket); } // restituisce il comando ricevuto e la dimensione pc.printf("Command: %s\n\r",caRxPacket); pc.printf("PacketSize: %d\n\r",nRxPacketSize); // confronta il comando ricevuto con quello di Read GPIO nReadCmd = strcmp(caRxPacket, "ReadGPIO"); if(nReadCmd==0) { // rileva lo stato degli input e trasmettili al PC-HOST pc.printf("USER-BUTTON: %d\n\r",myButton.read()); // il primo input è lo User-Button per scopi di diagnostica // myIn1: se legge 0/1, trasmette lo stato al PC if(myIn1.read()== 0x01) { pc.printf("In1: 1\n\r"); } else { pc.printf("In1: 0\n\r"); } // myIn2: se legge 0/1, trasmette lo stato al PC if(myIn2.read()== 0x01) { pc.printf("In2: 1\n\r"); } else { pc.printf("In2: 0\n\r"); } // myIn3: se legge 0/1, trasmette lo stato al PC if(myIn3.read()== 0x01) { pc.printf("In3: 1\n\r"); } else { pc.printf("In3: 0\n\r"); } // myIn4: se legge 0/1, trasmette lo stato al PC if(myIn4.read()== 0x01) { pc.printf("In4: 1\n\r"); } else { pc.printf("In4: 0\n\r"); } // myIn5: se legge 0/1, trasmette lo stato al PC if(myIn5.read()== 0x01) { pc.printf("In5: 1\n\r"); } else { pc.printf("In5: 0\n\r"); } } else { // verifica se nel comando ricevuto si trova la stringa WriteGPIO cCmdPosition=strstr(caRxPacket, "WriteGPIO"); if(cCmdPosition != NULL) // se il comando ricevuto contiene WriteGPIO, procedi con l'analisi dei dati { // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output cCmdPosition = strtok(caRxPacket,"-"); cCmdPosition = strtok(NULL,"-"); pc.printf("Data: %s\n\r", cCmdPosition); // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED if(cCmdPosition[0]=='1') { // accendi LED e comunica al PC pc.printf("Led2: ON\n\r"); myLed = 1; } else { // spegni LED e comunica al PC pc.printf("Led2: OFF\n\r"); myLed = 0; } // Out1: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[1]=='1') { // accendi Out1 e comunica al PC pc.printf("Out1: ON\n\r"); myOut1 = 1; } else { // spegni Out1 e comunica al PC pc.printf("Out1: OFF\n\r"); myOut1 = 0; } // Out2: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[2]=='1') { // accendi Out2 e comunica al PC pc.printf("Out2: ON\n\r"); myOut2 = 1; } else { // spegni Out2 e comunica al PC pc.printf("Out2: OFF\n\r"); myOut2 = 0; } // Out3: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[3]=='1') { // accendi Out3 e comunica al PC pc.printf("Out3: ON\n\r"); myOut3 = 1; } else { // spegni Out3 e comunica al PC pc.printf("Out3: OFF\n\r"); myOut3 = 0; } } } } */ } }