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

Dependencies:   mbed

Committer:
villemejane
Date:
Tue Mar 17 07:07:00 2020 +0000
Revision:
0:32af38c93bc6
Example of communication between a computer and a Nucleo board - RS232/USB - A terminal or interface is required

Who changed what in which revision?

UserRevisionLine numberNew contents of line
villemejane 0:32af38c93bc6 1 #include "mbed.h"
villemejane 0:32af38c93bc6 2
villemejane 0:32af38c93bc6 3 #define ETAT_STOP 0
villemejane 0:32af38c93bc6 4 #define ETAT_WAIT_PARAM 1
villemejane 0:32af38c93bc6 5 #define ETAT_WAIT_PARAM_N 11
villemejane 0:32af38c93bc6 6 #define ETAT_WAIT_PARAM_F 12
villemejane 0:32af38c93bc6 7 #define ETAT_WAIT_PARAM_S 13
villemejane 0:32af38c93bc6 8 #define ETAT_WAIT_GO 2
villemejane 0:32af38c93bc6 9 #define ETAT_ACQUIRING 3
villemejane 0:32af38c93bc6 10 #define ETAT_SENDING_DATA 4
villemejane 0:32af38c93bc6 11
villemejane 0:32af38c93bc6 12 // inputs and outputs configuration
villemejane 0:32af38c93bc6 13 DigitalOut debug_led(LED1);
villemejane 0:32af38c93bc6 14 Serial rs232(USBTX, USBRX);
villemejane 0:32af38c93bc6 15 AnalogIn can_input(A0);
villemejane 0:32af38c93bc6 16 InterruptIn sync_input(D10);
villemejane 0:32af38c93bc6 17
villemejane 0:32af38c93bc6 18 Ticker tictoc;
villemejane 0:32af38c93bc6 19 Ticker blinky;
villemejane 0:32af38c93bc6 20
villemejane 0:32af38c93bc6 21 // System functions
villemejane 0:32af38c93bc6 22 void ISR_sync(void);
villemejane 0:32af38c93bc6 23 void convert_signal(void);
villemejane 0:32af38c93bc6 24 void ISR_get_data(void);
villemejane 0:32af38c93bc6 25 void ISR_send_data(void);
villemejane 0:32af38c93bc6 26 void TIK_blink_led(void);
villemejane 0:32af38c93bc6 27
villemejane 0:32af38c93bc6 28 // System variables
villemejane 0:32af38c93bc6 29 int i, pdix, temp;
villemejane 0:32af38c93bc6 30 char etat = 0;
villemejane 0:32af38c93bc6 31 char data_received, i_received;
villemejane 0:32af38c93bc6 32 char tab_received[10] = {0};
villemejane 0:32af38c93bc6 33
villemejane 0:32af38c93bc6 34 // Acquisition parameters
villemejane 0:32af38c93bc6 35 int number_points;
villemejane 0:32af38c93bc6 36 int frequency;
villemejane 0:32af38c93bc6 37 char sync = 0;
villemejane 0:32af38c93bc6 38
villemejane 0:32af38c93bc6 39 // Acquisition data
villemejane 0:32af38c93bc6 40 int i_data;
villemejane 0:32af38c93bc6 41 int tab_data[10000];
villemejane 0:32af38c93bc6 42
villemejane 0:32af38c93bc6 43 // Main function
villemejane 0:32af38c93bc6 44 int main() {
villemejane 0:32af38c93bc6 45 number_points = 0;
villemejane 0:32af38c93bc6 46 frequency = 0;
villemejane 0:32af38c93bc6 47 i_received = 0;
villemejane 0:32af38c93bc6 48 etat = ETAT_STOP;
villemejane 0:32af38c93bc6 49 data_received = '0';
villemejane 0:32af38c93bc6 50 debug_led = 0;
villemejane 0:32af38c93bc6 51 i_data = 0;
villemejane 0:32af38c93bc6 52 rs232.baud(115200);
villemejane 0:32af38c93bc6 53 rs232.attach(&ISR_get_data);
villemejane 0:32af38c93bc6 54 sync_input.rise(&ISR_sync);
villemejane 0:32af38c93bc6 55 while(1) {
villemejane 0:32af38c93bc6 56 switch(etat){
villemejane 0:32af38c93bc6 57
villemejane 0:32af38c93bc6 58 case ETAT_SENDING_DATA :
villemejane 0:32af38c93bc6 59 rs232.putc('d');
villemejane 0:32af38c93bc6 60 blinky.detach();
villemejane 0:32af38c93bc6 61 tictoc.detach();
villemejane 0:32af38c93bc6 62 debug_led = 1;
villemejane 0:32af38c93bc6 63 for(i = 0; i < number_points; i++){
villemejane 0:32af38c93bc6 64 rs232.printf("[%d;%d]", i, tab_data[i]);
villemejane 0:32af38c93bc6 65 }
villemejane 0:32af38c93bc6 66 etat = ETAT_STOP;
villemejane 0:32af38c93bc6 67 debug_led = 0;
villemejane 0:32af38c93bc6 68 break;
villemejane 0:32af38c93bc6 69 default :
villemejane 0:32af38c93bc6 70 temp = 0;
villemejane 0:32af38c93bc6 71 }
villemejane 0:32af38c93bc6 72 }
villemejane 0:32af38c93bc6 73 }
villemejane 0:32af38c93bc6 74
villemejane 0:32af38c93bc6 75 void ISR_sync(void){
villemejane 0:32af38c93bc6 76 if((etat == ETAT_ACQUIRING) && (sync == 1)){
villemejane 0:32af38c93bc6 77 float period = 1.0/frequency;
villemejane 0:32af38c93bc6 78 tictoc.attach(&convert_signal,period);
villemejane 0:32af38c93bc6 79 }
villemejane 0:32af38c93bc6 80 }
villemejane 0:32af38c93bc6 81
villemejane 0:32af38c93bc6 82 void convert_signal(void){
villemejane 0:32af38c93bc6 83 tab_data[i_data] = can_input.read_u16() >> 4;
villemejane 0:32af38c93bc6 84 i_data++;
villemejane 0:32af38c93bc6 85 if(i_data == number_points){
villemejane 0:32af38c93bc6 86 etat = ETAT_SENDING_DATA;
villemejane 0:32af38c93bc6 87 tictoc.detach();
villemejane 0:32af38c93bc6 88 }
villemejane 0:32af38c93bc6 89 }
villemejane 0:32af38c93bc6 90
villemejane 0:32af38c93bc6 91 void ISR_send_data(){
villemejane 0:32af38c93bc6 92 i++;
villemejane 0:32af38c93bc6 93 rs232.printf("i=%d:\r\n", i);
villemejane 0:32af38c93bc6 94 }
villemejane 0:32af38c93bc6 95
villemejane 0:32af38c93bc6 96 void ISR_get_data(){
villemejane 0:32af38c93bc6 97 data_received = rs232.getc();
villemejane 0:32af38c93bc6 98 if((data_received == 'U') && (etat != ETAT_STOP) && (etat != ETAT_ACQUIRING) && (etat != ETAT_SENDING_DATA)){ // UPDATE parameters
villemejane 0:32af38c93bc6 99 rs232.putc('u');
villemejane 0:32af38c93bc6 100 etat = ETAT_WAIT_PARAM;
villemejane 0:32af38c93bc6 101 blinky.attach(&TIK_blink_led, 0.5);
villemejane 0:32af38c93bc6 102 }
villemejane 0:32af38c93bc6 103
villemejane 0:32af38c93bc6 104 switch(etat){
villemejane 0:32af38c93bc6 105 case ETAT_STOP :
villemejane 0:32af38c93bc6 106 if(data_received == 'a'){
villemejane 0:32af38c93bc6 107 etat = ETAT_WAIT_PARAM;
villemejane 0:32af38c93bc6 108 rs232.putc('o');
villemejane 0:32af38c93bc6 109 blinky.attach(&TIK_blink_led, 0.5);
villemejane 0:32af38c93bc6 110 }
villemejane 0:32af38c93bc6 111 break;
villemejane 0:32af38c93bc6 112 case ETAT_WAIT_PARAM :
villemejane 0:32af38c93bc6 113 if(data_received == 'n'){
villemejane 0:32af38c93bc6 114 rs232.putc('n');
villemejane 0:32af38c93bc6 115 etat = ETAT_WAIT_PARAM_N;
villemejane 0:32af38c93bc6 116 i_received = 0;
villemejane 0:32af38c93bc6 117 }
villemejane 0:32af38c93bc6 118 break;
villemejane 0:32af38c93bc6 119 case ETAT_WAIT_PARAM_N :
villemejane 0:32af38c93bc6 120 if(data_received == 'f'){
villemejane 0:32af38c93bc6 121 rs232.putc('f');
villemejane 0:32af38c93bc6 122 // param number of points
villemejane 0:32af38c93bc6 123 number_points = 0;
villemejane 0:32af38c93bc6 124 pdix = 1;
villemejane 0:32af38c93bc6 125 for(i = i_received-1; i >= 0; i--){
villemejane 0:32af38c93bc6 126 number_points += (tab_received[i] - '0') * pdix;
villemejane 0:32af38c93bc6 127 pdix = pdix * 10;
villemejane 0:32af38c93bc6 128 }
villemejane 0:32af38c93bc6 129 // next state
villemejane 0:32af38c93bc6 130 etat = ETAT_WAIT_PARAM_F;
villemejane 0:32af38c93bc6 131 i_received = 0;
villemejane 0:32af38c93bc6 132 }
villemejane 0:32af38c93bc6 133 else{
villemejane 0:32af38c93bc6 134 tab_received[i_received] = data_received;
villemejane 0:32af38c93bc6 135 i_received++;
villemejane 0:32af38c93bc6 136 }
villemejane 0:32af38c93bc6 137 break;
villemejane 0:32af38c93bc6 138 case ETAT_WAIT_PARAM_F :
villemejane 0:32af38c93bc6 139 if(data_received == 's'){
villemejane 0:32af38c93bc6 140 rs232.putc('s');
villemejane 0:32af38c93bc6 141 // param frequency
villemejane 0:32af38c93bc6 142 frequency = 0;
villemejane 0:32af38c93bc6 143 pdix = 1;
villemejane 0:32af38c93bc6 144 for(i = i_received-1; i >= 0; i--){
villemejane 0:32af38c93bc6 145 frequency += (tab_received[i] - '0') * pdix;
villemejane 0:32af38c93bc6 146 pdix = pdix * 10;
villemejane 0:32af38c93bc6 147 }
villemejane 0:32af38c93bc6 148 // next state
villemejane 0:32af38c93bc6 149 etat = ETAT_WAIT_PARAM_S;
villemejane 0:32af38c93bc6 150 i_received = 0;
villemejane 0:32af38c93bc6 151 }
villemejane 0:32af38c93bc6 152 else{
villemejane 0:32af38c93bc6 153 tab_received[i_received] = data_received;
villemejane 0:32af38c93bc6 154 i_received++;
villemejane 0:32af38c93bc6 155 }
villemejane 0:32af38c93bc6 156 break;
villemejane 0:32af38c93bc6 157 case ETAT_WAIT_PARAM_S :
villemejane 0:32af38c93bc6 158 // param synchro
villemejane 0:32af38c93bc6 159 sync = data_received - '0';
villemejane 0:32af38c93bc6 160 // next state
villemejane 0:32af38c93bc6 161 etat = ETAT_WAIT_GO;
villemejane 0:32af38c93bc6 162 i_received = 0;
villemejane 0:32af38c93bc6 163 rs232.printf("N=%d;F=%d;S=%d;",number_points, frequency, sync);
villemejane 0:32af38c93bc6 164 break;
villemejane 0:32af38c93bc6 165 case ETAT_WAIT_GO :
villemejane 0:32af38c93bc6 166 if(data_received == 'G'){
villemejane 0:32af38c93bc6 167 etat = ETAT_ACQUIRING;
villemejane 0:32af38c93bc6 168 blinky.detach();
villemejane 0:32af38c93bc6 169 blinky.attach(&TIK_blink_led, 0.1);
villemejane 0:32af38c93bc6 170 if(sync == 0){
villemejane 0:32af38c93bc6 171 float period = 1.0/frequency;
villemejane 0:32af38c93bc6 172 tictoc.attach(&convert_signal,period);
villemejane 0:32af38c93bc6 173 }
villemejane 0:32af38c93bc6 174 }
villemejane 0:32af38c93bc6 175 break;
villemejane 0:32af38c93bc6 176 default :
villemejane 0:32af38c93bc6 177 etat = ETAT_STOP;
villemejane 0:32af38c93bc6 178 debug_led = 0;
villemejane 0:32af38c93bc6 179 }
villemejane 0:32af38c93bc6 180 }
villemejane 0:32af38c93bc6 181
villemejane 0:32af38c93bc6 182 void TIK_blink_led(void){
villemejane 0:32af38c93bc6 183 debug_led = !debug_led;
villemejane 0:32af38c93bc6 184 }