我想通过串口发送一个结构内的元素列表,但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
答案 0 :(得分:3)
你有几个错误......
此代码:
void fn_nd_function(){
Serial.println('test');
}
测试是不是单个字符呢?那你为什么用单引号呢?
但更重要的是,这是导致输出不良的原因:
menu_add_item("item " + i, fn_nd_function);
"item" + i
不是如何将数字连接到字符串"item"
的末尾。这是C ++而不是Java或Python。您必须单独构建该字符串。请不要试图使用String
类,因为这可能会导致其他问题。
现在发生的是你正在传递"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);