#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. Снова глупая ошибка, которая снова стоила мне много времени.