Example of communication between a computer and a Nucleo board - RS232/USB - a terminal or an interface is required on the computer

Dependencies:   mbed

main.cpp

Committer:
villemejane
Date:
2020-03-17
Revision:
0:32af38c93bc6

File content as of revision 0:32af38c93bc6:

#include "mbed.h"

#define     ETAT_STOP           0
#define     ETAT_WAIT_PARAM     1
#define     ETAT_WAIT_PARAM_N   11
#define     ETAT_WAIT_PARAM_F   12
#define     ETAT_WAIT_PARAM_S   13
#define     ETAT_WAIT_GO        2
#define     ETAT_ACQUIRING      3
#define     ETAT_SENDING_DATA   4

// inputs and outputs configuration
DigitalOut  debug_led(LED1);
Serial      rs232(USBTX, USBRX);
AnalogIn    can_input(A0);
InterruptIn sync_input(D10);

Ticker tictoc;
Ticker blinky;

// System functions
void ISR_sync(void);
void convert_signal(void);
void ISR_get_data(void);
void ISR_send_data(void);
void TIK_blink_led(void);

// System variables
int i, pdix, temp;
char etat = 0;
char data_received, i_received;
char tab_received[10] = {0};

// Acquisition parameters
int     number_points;
int     frequency;
char    sync = 0;

// Acquisition data
int     i_data;
int     tab_data[10000];

// Main function
int main() {
    number_points = 0;
    frequency = 0;
    i_received = 0;
    etat = ETAT_STOP;
    data_received = '0';
    debug_led = 0;
    i_data = 0;
    rs232.baud(115200);
    rs232.attach(&ISR_get_data);
    sync_input.rise(&ISR_sync);
    while(1) {
        switch(etat){

            case ETAT_SENDING_DATA :
                rs232.putc('d');
                blinky.detach();
                tictoc.detach();
                debug_led = 1;
                for(i = 0; i < number_points; i++){
                    rs232.printf("[%d;%d]", i, tab_data[i]);
                }
                etat = ETAT_STOP;
                debug_led = 0;
                break;
            default :
                temp = 0;
        }
    }
}

void ISR_sync(void){
    if((etat == ETAT_ACQUIRING) && (sync == 1)){
        float period = 1.0/frequency;
        tictoc.attach(&convert_signal,period);
    }
} 

void convert_signal(void){
    tab_data[i_data] = can_input.read_u16() >> 4;
    i_data++;
    if(i_data == number_points){
        etat = ETAT_SENDING_DATA;
        tictoc.detach();
    }
}

void ISR_send_data(){
    i++;
    rs232.printf("i=%d:\r\n", i);
}

void ISR_get_data(){
    data_received = rs232.getc();
    if((data_received == 'U') && (etat != ETAT_STOP) && (etat != ETAT_ACQUIRING) && (etat != ETAT_SENDING_DATA)){   // UPDATE parameters
        rs232.putc('u');
        etat = ETAT_WAIT_PARAM;
        blinky.attach(&TIK_blink_led, 0.5);
    }
    
    switch(etat){
        case ETAT_STOP :
            if(data_received == 'a'){
                etat = ETAT_WAIT_PARAM;
                rs232.putc('o');
                blinky.attach(&TIK_blink_led, 0.5);
            }            
            break;
        case ETAT_WAIT_PARAM :
            if(data_received == 'n'){
                rs232.putc('n');
                etat = ETAT_WAIT_PARAM_N;
                i_received = 0;
            }
            break;    
        case ETAT_WAIT_PARAM_N :
            if(data_received == 'f'){
                rs232.putc('f');
                // param number of points
                number_points = 0;
                pdix = 1;
                for(i = i_received-1; i >= 0; i--){
                    number_points += (tab_received[i] - '0') * pdix;
                    pdix = pdix * 10;
                }
                // next state
                etat = ETAT_WAIT_PARAM_F;
                i_received = 0;
            }
            else{
                tab_received[i_received] = data_received;
                i_received++;
            }
            break;    
        case ETAT_WAIT_PARAM_F :
            if(data_received == 's'){
                rs232.putc('s');
                // param frequency
                frequency = 0;
                pdix = 1;
                for(i = i_received-1; i >= 0; i--){
                    frequency += (tab_received[i] - '0') * pdix;
                    pdix = pdix * 10;
                }
                // next state
                etat = ETAT_WAIT_PARAM_S;
                i_received = 0;
            }
            else{
                tab_received[i_received] = data_received;
                i_received++;
            }
            break; 
        case ETAT_WAIT_PARAM_S :
            // param synchro
            sync = data_received - '0';
            // next state
            etat = ETAT_WAIT_GO;
            i_received = 0;
            rs232.printf("N=%d;F=%d;S=%d;",number_points, frequency, sync);
            break; 
        case ETAT_WAIT_GO :
            if(data_received == 'G'){
                etat = ETAT_ACQUIRING;
                blinky.detach();
                blinky.attach(&TIK_blink_led, 0.1);
                if(sync == 0){
                    float period = 1.0/frequency;
                    tictoc.attach(&convert_signal,period);
                }   
            }
            break;
        default :
            etat = ETAT_STOP;
            debug_led = 0;
    }
}

void TIK_blink_led(void){
    debug_led = !debug_led;
}