2017-09-05 1 views
-1

Je voudrais envoyer une liste d'éléments à l'intérieur d'une structure via un port série, mais la sortie produite par Arduino est anormale.Arduino ne renvoie pas la sortie désirée via le port série

Un petit coup de pouce? Quelle est la raison de cette sortie anormale?

const int menu_max_item = 20; 
int menu_num_item = 0; 

typedef struct item_menu{ 
    String text; 
    void (*func)(void); 
} t_item_menu; 

t_item_menu arr_menu[menu_max_item]; 

void menu_add_item(String txt, void (*f)(void)){ 
    arr_menu[menu_num_item].text = txt; 
    arr_menu[menu_num_item].func = f; 
    menu_num_item++; 
} 

void fn_nd_function(){ 
    Serial.println('test'); 
} 

void print_menu_lcd(){ 
    for(int x = 0; x < 4 && x < menu_num_item; x++){ 
    lcd.setCursor(0,x); 
    lcd.print(arr_menu[x].text); 
    } 
} 

void setup(){ 
    Serial.begin(9600); 
    for(int i = 0; i < 2; i++) menu_add_item("item " + i, fn_nd_function); 
} 

void loop() { 
    print_menu_lcd(); 
    delay(1000); 
} 

La production réelle

item 
tem 
em 

de sortie désiré

item 1 
item 2 
item 3 
+1

_sigh! _ Arduino est ** pas ** C. – Olaf

Répondre

3

Vous avez quelques erreurs ...

  1. Ce code:

    void fn_nd_function(){ 
        Serial.println('test'); 
    } 
    

essai n'est pas un seul caractère est-il? Alors pourquoi l'avez-vous en guillemets simples?

Mais surtout ce qui est la cause de votre mauvaise sortie:

menu_add_item("item " + i, fn_nd_function); 

"item" + i est comment vous concaténer un numéro à la fin de la chaîne de caractères "item". C'est C++ pas Java ou Python. Vous devrez construire cette chaîne séparément. S'il vous plaît ne soyez pas tenté d'utiliser la classe String car cela peut causer d'autres problèmes.

Ce qui se passe est maintenant que vous êtes de passage "item" qui est un pointeur sur le tableau de caractères stockés quelque part dans la mémoire contenant les caractères 'i', 't', 'e' et 'm'. Lorsque vous ajoutez 1 à ce pointeur, vous obtenez un pointeur pointant vers 't' et lorsque vous ajoutez 2, vous obtenez un pointeur pointant vers 'e'. Ainsi, lorsque vous imprimez à partir de ces pointeurs, vous obtenez seulement la partie après ce que ce pointeur indique.

Vous devez avoir une ligne avant de commencer par créer la chaîne. Quelque chose dans le style de:

char str[7] = "item "; // Note the two spaces to leave room for the digit 
str[5] = i + '0'; // Add '0' to convert single digit to ascii 
menu_add_item(str, fn_nd_function);