Сначала кажется, что вы используете компилятор avr-gcc. При создании вопросов для встроенных устройств всегда нужно указывать, какой компилятор вы используете.
Теперь я постараюсь помочь вам понять, что не так с вашим кодом и почему ваше решение работает. Функция, которую вы определили:
void send_string(const char * msg);
ожидает указатель строки в оперативной памяти. Неважно, что вы использовали ключевое слово const
, компилятор все еще ожидает, что строка будет в ОЗУ. Так что если у вас есть строка в ПЗУ:
const char msg[] PROGMEM = "Test";
и вы пытаетесь передать его в своей функции:
send_string(msg);
он просто передает ему неверный адрес и, таким образом, отображает тарабарщину. Если вместо этого вы сначала скопируете его в оперативную память, как вы делали это в своем решении, он работает нормально:
char buf[strlen(msg)];
strcpy_P(buf,msg);
send_string(buf);
Если вы хотите определить функцию, которая будет непосредственно читать строку ПЗУ, вы можете сделать это следующим образом:
void send_string_P(const char *data)
{
while (pgm_read_byte(data) != 0x00)
send_char(pgm_read_byte(data++));
}
Обратите внимание на суффикс _P
. Это общее соглашение, используемое для отделения функций, работающих на ПЗУ, от функций, работающих на ОЗУ.
Все это и многое другое хорошо объяснено здесь . Я также предлагаю вам попробовать форум такого типа AVR Freaks . Люди, несомненно, будут более опытными в этих вопросах, чем пользователи Stack Overflow, и всегда рады помочь.