我正在尝试从程序存储器中读取和打印avr中的unicode字符串(希腊文,我正在使用__flash属性,但是我的字符串损坏了。例如:我得到ΧΡΤ⸮⸮而不是ΧΡΗΣΤΗ,英语似乎以某种方式起作用。
这是我这样做的方式:
在Print_menu_file.c中:
static const __flash char * const __flash *Unicode_text;
const __flash char * const __flash Greek_text[35]=
{
(const __flash char[40]) { "ΜΕΝΟΥ ΧΡΗΣΤΗ" }, //USER_MENU
(const __flash char[]) { "ΡΥΘΜΙΣΗ ΗΜΕΡ/ΩΡΑΣ" }, //SET_DATE_TIME
(const __flash char[]) { "ΠΡΟΒ. ΑΙΣΘΗΤΗΡΩΝ" }, //SHOW_SENSRORS
(const __flash char[]) { "ΘΕΡΜΟΚΡΑΣ. 1/2" }, //TEMP_1_OF_2
}
void Print_string(void)
{
char* string=0;
Unicode_text=Greek_text;
strcpy_P(string,Unicode_text[1]);
lcd_print_unicode(string);
}
就像池上的评论所暗示的那样,您的问题出在此代码中:
void Print_string(void)
{
/////problem below//////
char* string=0;
/////problem above/////
Unicode_text=Greek_text;
strcpy_P(string,Unicode_text[1]);
lcd_print_unicode(string);
}
您有一个指向字符缓冲区的指针指向0。现在,0可能是为目标strcopy分配的缓冲区,但很可能不是(它可能是向量表)。
strcpy_P
不会为您分配缓冲区。它只会写入您提供的指针的缓冲区。
制作
char * string=0;
进入
char string[MAX_EXPECTED_STRING_LENGTH_PLUS_TERMINATING_0];
您的问题将得到解决。