Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 3 months ago. This question has been closed. Reason: Duplicate question
Receive the string from c++ and analyzes the string
The purpose of this program is to receive a string from c ++. Analyze the string by finding matching language phonemes: Italian. The phonemes match the indexes of the associated images. These images will be displayed on the dispaly (they are images that imitate the lips of the man and move in different ways according to the string we receive). It is also possible to choose a time t based on which two, one or zero intermediate images can be placed between two phonemes.
The problem is that it only receives the first 16 characters of the string, why? After the first run I have to reset mbed, why?
#include "mbed.h" #include "uLCD_4D_Picaso.h" // three pins are: TX RX RESET uLCD_4D_Picaso Display(p13, p14, p15); Serial pc(USBTX, USBRX); // tx, rx DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); int disk; uint16_t hndl0; //contiene l'indirizzo dei file con le immagini per le espressioni fisse uint16_t hndl; //a seconda del caso in cui ci troveremo assegnerò a questa variabile il valore di hndl1 o hndl2 uint16_t hndl1; //contiene l'indirizzo dei file con le 2 immagini intermedie uint16_t hndl2; //contiene l'indirizzo dei file con 1 immagine intermedia int iImage1_1 = 0, iImage2_1 = 1, iImage3_1 = 2, iImage4_1 = 3, iImage5_1 = 4, iImage6_1 = 5, //indici delle immagini per le iImage7_1 = 6, iImage8_1 = 7, iImage9_1 = 8; char stringa[200]; int seq_ph[200]; struct phoneme{ char poss_ph[25][4]; int lips; }; phoneme vect_ph[20]; struct trsz2{ //struct in cui si possono salvare gli indici di 2 immagini int indx [2]; }; trsz2 mat_trsz2[7][7]; //matrice in cui salvo gli indici delle immagini che uso per realizzare l'algoritmo con 2 immagini intermedie int mat_trsz1[7][7]; //matrice in cui salvo gli indici delle immagini che uso per realizzare l'algoritmo con 1 immagine intermedia int image_index; //indice che uso per scorrere le immagini nella visualizzazione int vett_fin[600]; //vettore finale in cui salvo tutti gli indici delle immagini, anche quelle intermedie Ticker show_image; //interrupt temporizzata che uso per la visualizzazione delle immagini float t=0.08; //intervallo tra la visualizzazione dell'immagine di un fonema e l'immagine del fonema successivo float durata=0.08; //durata della visualizzazione della singola immagine void italian_ph() { for (int i=0; i<20; i++) { for (int j=0; j<25; j++) for (int k=0; k<4; k++) { vect_ph[i].poss_ph[j][k]='\0'; } vect_ph[i].lips=0; } vect_ph[0].poss_ph[0][0]='a'; vect_ph[0].lips=1; vect_ph[1].poss_ph[0][0]='o'; vect_ph[1].poss_ph[1][0]='u'; vect_ph[1].poss_ph[2][0]='h'; vect_ph[1].poss_ph[3][0]='q'; vect_ph[1].poss_ph[3][1]='u'; vect_ph[1].lips=2; vect_ph[2].poss_ph[0][0]='e'; vect_ph[2].poss_ph[1][0]='i'; vect_ph[2].lips=3; vect_ph[3].poss_ph[0][0]='c'; vect_ph[3].poss_ph[1][0]='d'; vect_ph[3].poss_ph[2][0]='g'; vect_ph[3].poss_ph[3][0]='n'; vect_ph[3].poss_ph[4][0]='s'; vect_ph[3].poss_ph[5][0]='t'; vect_ph[3].poss_ph[6][0]='z'; vect_ph[3].poss_ph[7][0]='g'; vect_ph[3].poss_ph[7][1]='n'; vect_ph[3].poss_ph[8][0]='f'; vect_ph[3].poss_ph[9][0]='v'; vect_ph[3].poss_ph[10][0]='s'; vect_ph[3].poss_ph[10][1]='c'; vect_ph[3].poss_ph[11][0]='c'; vect_ph[3].poss_ph[11][1]='h'; vect_ph[3].poss_ph[12][0]='s'; vect_ph[3].poss_ph[12][1]='t'; vect_ph[3].lips=4; vect_ph[4].poss_ph[0][0]='l'; vect_ph[4].poss_ph[1][0]='r'; vect_ph[4].lips=5; vect_ph[5].poss_ph[0][0]='m'; vect_ph[5].poss_ph[1][0]='b'; vect_ph[5].poss_ph[2][0]='p'; vect_ph[5].lips=6; vect_ph[6].poss_ph[0][0]='-'; vect_ph[6].poss_ph[1][0]='.'; vect_ph[6].lips=7; return; } //Questa funzione riempie le matrici in cui salvo gli indici delle immagini intermedie void riemp_mat() { for (int i=0; i<7; i++) for (int j=0; j<7; j++){ mat_trsz1[i][j]=0; //inizializzo la matrice con gli indici per l'algoritmo con 1 immagine intermedia for (int z=0; z<2; z++) mat_trsz2[i][j].indx[z]=0; //inizializzo la matrice con gli indici per l'algoritmo con 2 immagini intermedie } int increm1=0, increm2=0; int start_riga=0,start_col=1; for (int i=start_riga; i<6; i++) //riempio solo la parte delle matrici sopra la diagonale, tanto sono simmetriche { for (int j=start_col; j<7; j++){ mat_trsz1[i][j]=8+increm1; //parto dall'indice 8 perchè le immagini da 1 a 7 corrispondono alle 7 immagini associate ai 7 gruppi di fonemi increm1++; for (int z=0; z<2; z++) { mat_trsz2[i][j].indx[z]=8+increm2; increm2++; } } start_col++; } return; } void control () { int z=0; bool ok3=false, ok2=false, ok1=false; char temp[4]; for (int q=0; q<4; q++) temp[q]='\0'; int index_seq=0; while (stringa[z]!=0) { if (ok3==false && z<197) { for (int j=0; j<3; j++) { temp[j]=stringa[z+j]; } for (int k=0; k<20 && ok3==false; k++) { for (int h=0; h<25 && ok3==false; h++) { if (temp[0]==vect_ph[k].poss_ph[h][0]) if (temp[1]==vect_ph[k].poss_ph[h][1]) if (temp[2]==vect_ph[k].poss_ph[h][2]) { ok3=true; seq_ph[index_seq]=vect_ph[k].lips; //pc.printf("%d",(seq_ph[index_seq])); index_seq++; z=z+3; } } } } if (ok3==false && ok2==false && z<198) { for (int j=0; j<2; j++) { temp[j]=stringa[z+j]; } for (int k=0; k<20 && ok2==false; k++) { for (int h=0; h<25 && ok2==false; h++) { if (temp[0]==vect_ph[k].poss_ph[h][0]) if (temp[1]==vect_ph[k].poss_ph[h][1]) { ok2=true; seq_ph[index_seq]=vect_ph[k].lips; //pc.printf("%d",(seq_ph[index_seq])); index_seq++; z=z+2; } } } } if (ok3==false && ok2==false && ok1==false && z<199) { temp[0]=stringa[z]; for (int k=0; k<20 && ok1==false; k++) { for (int h=0; h<25 && ok1==false; h++) { if (temp[0]==vect_ph[k].poss_ph[h][0]) { ok1=true; seq_ph[index_seq]=vect_ph[k].lips; //pc.printf("%d",(seq_ph[index_seq])); index_seq++; z=z+1; } } } } if (ok3==false && ok2==false && ok1==false) // new z++; // new ok3=false; ok2=false; ok1=false; } return; } void insert() { int i=0; char ch=0; do { if (pc.readable()) // if there is an character to read from the device { ch = pc.getc(); // read it if (i<200) // just to avoid buffer overflow stringa[i++]=ch; // put it into the value array and increment the index } } while (ch!='\n'); // loop until the '\n' character stringa[i]=0; pc.printf(stringa); } //Questa funzione mi permette di inserire l'intervallo di tempo che deve intercorrere tra la visualizzazione delle immagini associate a due fonemi consecutivi void insert_t() { pc.printf("Inserisci valore dell'intervallo temporale t: "); pc.scanf("%f",&t); pc.printf("\nRicevuto: %f \n",t); return; } //Questa funzione crea un vettore in cui sono presenti anche gli indici delle immagini intermedie, a partire dal vettore degli indici delle immagini fondamentali void control_vett_fin() { for (int i=0; i<600; i++) //inizializzo il vettore vett_fin[i]=0; int position=0; int pos_fin=0; //a secondo dell'intervallo t, uso due, una o nessuna immagine intermedia if (t>=0.36) //in questo caso ne uso 2 { while (seq_ph[position]!=0 && position<198) //fino a che il vettore degli indici dei fonemi non termina oppure sforo la sua dimensione { vett_fin[pos_fin]=seq_ph[position]; //inizialmente carico il primo indice trovato nel nuovo vettore pc.printf("%d",(vett_fin[pos_fin])); pos_fin++; //e mi sposto di una posizione in questo vettore int precedente=seq_ph[position]; //salvo l'indice del primo fonema position++; //e mi sposto di una posizione nel vettore degli indici fondamentali int successivo=seq_ph[position]; //salvo l'indice del secondo fonema if (successivo==0) //se non c'è un fonema successivo allora carico la sequenza di immagini per chiudere la bocca for (int i=0; i<2; i++) { vett_fin[pos_fin+i]=mat_trsz2[precedente-1][6].indx[i]; //la sequenza di immagini per chiudere la bocca è sempre all'ultima colonna delle matrice pc.printf("%d",(vett_fin[pos_fin+i])); } else //N.B. C'è "precedente-1" perchè gli indici delle immagini salvate nella SD parte da 0 e non da 1 come stiamo suppponendo in questo programma { if (precedente==successivo) { for (int i=0; i<2; i++) { vett_fin[pos_fin+i]=precedente; //in questo caso ricopio due volte lo stesso indice pc.printf("%d",(vett_fin[pos_fin+i])); } } else if (precedente<successivo) { for (int i=0; i<2; i++) { vett_fin[pos_fin+i]=mat_trsz2[precedente-1][successivo-1].indx[i]; //sto sopra la diagonale e quindi prendo gli indici che trovo nella locazione indicata da precedente e successivo pc.printf("%d",(vett_fin[pos_fin+i])); } } else if (precedente>successivo) { for (int i=0; i<2; i++) { vett_fin[pos_fin+i]=mat_trsz2[successivo-1][precedente-1].indx[1-i]; //starei sotto la diagonale, quindi basta invertire indici di riga e colonna per spostarsi sopra la diagonale e poi prendo gli indici in ordine inverso pc.printf("%d",(vett_fin[pos_fin+i])); } } pos_fin=pos_fin+2; //mi sposto di 2 posizioni nel vettore finale } } durata=t/3; //in questo caso ho il tempo per visualizzare 3 immagini hndl=hndl2; //carico l'indirizzo della lista di immagini con 2 immagini intermedie } else if (t>=0.24 && t<0.36) { while (seq_ph[position]!=0 && position<198) { vett_fin[pos_fin]=seq_ph[position]; pc.printf("%d",(vett_fin[pos_fin])); pos_fin++; int precedente=seq_ph[position]; position++; int successivo=seq_ph[position]; if (successivo==0) { vett_fin[pos_fin]=mat_trsz1[precedente-1][6]; pc.printf("%d",(vett_fin[pos_fin])); } else { if (precedente==successivo) { vett_fin[pos_fin]=precedente; pc.printf("%d",(vett_fin[pos_fin])); } else if (precedente<successivo) { vett_fin[pos_fin]=mat_trsz1[precedente-1][successivo-1]; pc.printf("%d",(vett_fin[pos_fin])); } else if (precedente>successivo) { vett_fin[pos_fin]=mat_trsz1[successivo-1][precedente-1]; pc.printf("%d",(vett_fin[pos_fin])); } pos_fin=pos_fin++; } } durata=t/2; hndl=hndl1; } else if (t<0.24) { while (seq_ph[position]!=0 && position<198) { vett_fin[pos_fin]=seq_ph[position]; pc.printf("%d",(vett_fin[pos_fin])); pos_fin++; position++; } durata=t; hndl=hndl1; } return; } //Questa fuzione è chiamata periodicamente dal ticker per mostrare a video le immagini void show() { led4 = !led4; if (image_index>=600 || vett_fin[image_index]==0) { show_image.detach(); //se non ci sono più immagini da mostrare allora scollego il ticker led1 = !led1; Display.img_Show(hndl,6); //torno a mostare l'immagine di default image_index=0; //pongo uguale a 0 l'indice per lo scorrimento delle immagini perchè così posso rivedere il movimento della bocca senza rinserire la stringa } else { Display.img_Show(hndl,vett_fin[image_index]-1); //fa mostrare all'lcd l'immagine. N.B. cè il -1 perchè nella SD gli indici partono da 0 image_index++; } return; } int main() { pc.baud(115200); Display.gfx_ScreenMode(Picaso::LANDSCAPE); //uSD card mount routine Display.putStr("Mounting...\n"); //print a string disk = Display.file_Mount(); if(disk==0) { while(disk==0) { Display.putStr("Drive not mounted... %i" ); wait(0.200); Display.gfx_Cls(); wait(0.200); disk = Display.file_Mount(); } } Display.gfx_BGcolour(Picaso::WHITE ) ; //change background color to white Display.gfx_Cls(); //clear the screen //load the graphics files hndl0 = Display.file_LoadImageControl("NoName2.dat", "NoName2.gci", 1); hndl2 = Display.file_LoadImageControl("WORKSH~1.dat", "WORKSH~1.gci", 1); hndl1 = Display.file_LoadImageControl("1frame.dat", "1frame.gci", 1); Display.img_Show(hndl1,6); //mentre aspetto i comandi viene mostrata un'espressione sorridente italian_ph(); riemp_mat(); while(1){ insert(); control(); insert_t(); control_vett_fin(); show_image.attach(&show,durata); } }
1 Answer
7 years, 3 months ago.
Hi Thomas,
Because your question is too broad, it is difficult to assist you with such a large code snippet. Please visit the following resources to help debug your code:
- Debugging mbed OS applications
- Debugging with printf() calls
- Debugging with other IDEs
- Mbed OS API Reference for
Serial
Please let me know if you have any further questions!
- Jenny, team Mbed
How are you entering the string? The serial port recieve buffer is 16 bytes, if you only see 16 characters it could be that you're sending the text before the program is ready for it and so the buffer overflows.
Also the show function will probably crash if hndl has not been defined which is possible depending on the string entered. You should set it to a default value on startup.
posted by Andy A 25 Aug 2017