Сохранение данных в памяти программ (PROGMEM) и отправка их через последовательный порт USB на экран PuTTY - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь сохранить данные в PROGMEM и получить их позже.Затем отправьте их через последовательный порт USB на экран.

int8_t serial_comm_write(const uint8_t *buffer, uint16_t size){
    //Here contains the code from the lib which I don't understand.
    //Basically, it's sending data (char *data) thru to screen. 
}

//This char *data could simply be:
// char *line = "This is stored in RAM"
//usb_send_info(line); would send the "line" to the screen.
void usb_send_info(char *data){
    serial_comm_write((uint8_t *)data, strlen(data));
}

//This doesn't work. I got a squiggly line saying "unknown register name 
//'r0'
//have no idea what it means. 
void usb_send_info_P(const char *data){
    while(pgm_read_byte(data) != 0x00){
        usb_send_info((pgm_read_byte(data++))); 
    }
}

const static char line1[] PROGMEM = "This is stored in flash mem";

usb_send_info_P(line1);

Это просто не работает.Какие-нибудь советы или альтернативы?Приветствия.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Получил помощь от помощника.Для тех, кто задается вопросом, вот ответ на вопрос.Отдельное спасибо Джонатану.

int8_t serial_comm_transmit(uint8_t c)
{
    uint8_t timeout, intr_state;

    if (!usb_configuration) return -1;

    intr_state = SREG;
    cli();
    UENUM = CDC_TX_ENDPOINT;

    if (transmit_previous_timeout) {
        if (!(UEINTX & (1<<RWAL))) {
            SREG = intr_state;
            return -1;
        }
        transmit_previous_timeout = 0;
    }

    timeout = UDFNUML + TRANSMIT_TIMEOUT;
    while (1) {

        if (UEINTX & (1<<RWAL)) break;
        SREG = intr_state;

        if (UDFNUML == timeout) {
            transmit_previous_timeout = 1;
            return -1;
        }

        if (!usb_configuration) return -1;

        intr_state = SREG;
        cli();
        UENUM = CDC_TX_ENDPOINT;
    }

    UEDATX = c;

    if (!(UEINTX & (1<<RWAL))) UEINTX = 0x3A;
    transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT;
    SREG = intr_state;
    return 0;
}

void usb_send_info(const char *data){
    for (int i = 0; i < strlen_P(data); i ++){
        serial_comm_transmit(pgm_read_byte(&data[i]));
    }
}

static char line1[] PROGMEM = "This is stored in flash mem";

usb_send_info(line1);
0 голосов
/ 25 октября 2018

usb_send_info ожидает символ *, указывающий на SRAM, а не на FLASH (PROGMEM).

usb_send_info((pgm_read_byte(data++))); 

pgm_read_byte считывает один байт / символ с заданного адреса PROGMEM.Он не возвращает указатель.Так что этот вызов функции не имеет смысла.

Если вы измените usb_send_info следующим образом, он должен работать:

void usb_send_info(char data) {
    serial_comm_write((uint8_t *)&data, 1);
}
...