Неинтересно мучаться с модификаторам в зависимости от источника данных - проще через __generic
Ну и насчет макроса - или показывайте какой он крутой, или не юзайте в таком контексте - "подводные грабли" могут быть

)
__flash unsigned char on[] = "\nON command received!\0";
void USART_transmit_string_from_flash(unsigned char __generic *ptr)
{
unsigned char c;
while(*ptr)
{
c=ptr++;
USART_transmit©;//функция вывода байта
}
}
Вызов
USART_transmit_string_from_flash(&on[0]);