Микроконтроллер непрерывно получает значение «255ld» через виртуальный последовательный порт

#c #microcontroller #atmega #virtual-serial-port

#c #микроконтроллер #atmega #виртуальный последовательный порт

Вопрос:

Надеюсь, это не глупый вопрос, но я сам не могу найти ответ на свою проблему.

Я работаю над микроконтроллерным устройством ATmega32U4, которое должно получать серию байтов и сохранять их. Мой код основан на шаблоне виртуального последовательного драйвера CDC из LUFA-библиотеки 151115. Чтобы протестировать свой код, я использую очень полезный инструмент ScriptCommunicator 04.11. Блок микроконтроллера (MCU) подключается через USB к ПК и обрабатывается хостом ПК как устройство с последовательным com-портом. Моя ОС — 64-разрядная Windows 7.

В настоящее время я пишу функцию, в которой должны быть получены и сохранены шесть значений. Для этого я использую следующий код:

 int16_t Register_1 = 0;     
int16_t Register_2 = 0;     
int16_t Register_3 = 0;     

int16_t Register_4 = 0;
int16_t Register_5 = 0;
int16_t Register_6 = 0;     

int16_t serial_byte = 0;
int8_t loop = 1;

do
{
    serial_byte = CDC_Device_ReceiveByte(amp;VirtualSerial_CDC_Interface);

    serial_byte amp;= 0x00FF;

    switch (loop)
    {
        case 1:     Register_1 = ad7194_byte;       break;
        case 2:     Register_2 = ad7194_byte;       break;
        case 3:     Register_3 = ad7194_byte;       break;
        case 4:     Register_4 = ad7194_byte;       break;
        case 5:     Register_5 = ad7194_byte;       break;
        case 6:     Register_6 = ad7194_byte;       break;
    }


    CDC_Device_USBTask(amp;VirtualSerial_CDC_Interface);

    USB_USBTask();

    loop    ;

    printf("%i" PRId32 "n", serial_byte) ;

    _delay_ms(1000);

} while (loop < 7);
  

Ранее я использовал аналогичный фрагмент кода, и все, казалось, работало нормально. Теперь я определил следующую проблему:
Устройство постоянно возвращает значение «255ld». Поскольку, когда я тестирую приведенный выше код с помощью ScriptCommunicator, я получаю это значение шесть раз (именно поэтому printf-оператор включен в приведенный выше код).

У меня есть подозрение, что это происходит потому, что Windows обрабатывает MCU как обычное USB-устройство, например, мышь? Может ли это быть так?

Или что еще может быть причиной этого?

Как я могу обойти мою проблему?

Заранее спасибо за любые подсказки и ответы!

Комментарии:

1. Не требуется инициализация устройств?

2. "255ld" это 5 значений, а не одно.

Ответ №1:

Неправильное использование формата.

 int16_t serial_byte = 0;
//          v (remove i) 
// printf("%i" PRId32 "n", serial_byte) ;
//             16 not 32
printf("%" PRId16 "n", serial_byte) ;
  

Ответ №2:

Спасибо за ответ, который не решил мою проблему напрямую, но отчасти привел меня к решению.

Решение: я получил 255 значений, хотя я ничего не отправлял в MCU. Но: если байт не получен, функция LUFA CDC_Device_ReceiveByte возвращает -1. Я забыл проверить это значение перед операцией serial_byte amp;= 0x00FF; . Затем значение -1 было перепутано, и получилось значение 255. Снова глупая ошибка, которая снова стоила мне много времени.