Arduino 没有 return 通过串行端口获得所需的输出

Arduino does not return the desired output via serial port

我想通过串口发送一个结构内部的元素列表,但是Arduino输出异常

有点帮助?这个异常输出是什么原因?

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);
}

实际输出

item 
tem 
em

期望的输出

item 1
item 2
item 3

你有几个错误...

  1. 此代码:

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

test 不是单个字符吗?那么为什么要用单引号引起来呢?

但更重要的是,这是您输出错误的原因:

menu_add_item("item " + i, fn_nd_function);

"item" + i 不是将数字连接到字符串 "item" 末尾的方式。这是 C++,不是 Java 或 Python。您必须单独构建该字符串。请不要试图使用 String class,因为这可能会导致其他问题。

现在发生的事情是你正在传递 "item" 这是一个指向存储在内存中某处的字符数组的指针,其中包含字符 'i''t''e''m'。当您向该指针添加 1 时,您最终得到一个指向 't' 的指针,当您添加 2 时,您最终得到一个指向 'e' 的指针。因此,当您从这些指针打印时,您只会得到该指针指向的部分。

你需要在它前面有一行来首先构建字符串。大致如下:

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);