微控制器通过虚拟串口连续接收值“255ld”
Microcontroller receives the value "255ld" continuously via virtual serial port
我希望这不是一个愚蠢的问题,但我自己找不到问题的答案。
我正在研究 Atmega32U4 微控制器设备,它应该接收一系列字节并存储它们。我的代码基于 LUFA-Library 151115 中的 CDC 虚拟串行驱动程序模板。为了测试我的代码,我使用了非常有用的工具 ScriptCommunicator 04.11。微控制器单元 (MCU) 通过 USB 连接到 PC,并被 PC 主机视为串行 com 端口设备。我的 OS 是 Windows 7 64 位。
目前,我正在编写一个函数,其中应接收和存储六个值。
为此,我使用以下代码:
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(&VirtualSerial_CDC_Interface);
serial_byte &= 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(&VirtualSerial_CDC_Interface);
USB_USBTask();
loop ++ ;
printf("%i" PRId32 "\n", serial_byte) ;
_delay_ms(1000);
} while (loop < 7);
我之前使用过类似的代码片段,一切似乎都运行良好。现在我发现了以下问题:
设备不断收到值“255ld”。因为当我用 ScriptCommunicator 测试上面的代码时,我收到了这个值六次(这就是上面代码中包含 printf 语句的原因)。
我怀疑发生这种情况是因为 Windows 将 MCU 视为普通 USB 设备,例如一个鼠标?难道是这样吗?
或者这可能是什么原因?
我该如何解决我的问题?
提前感谢您的任何提示和回答!
格式使用错误。
int16_t serial_byte = 0;
// v (remove i)
// printf("%i" PRId32 "\n", serial_byte) ;
// 16 not 32
printf("%" PRId16 "\n", serial_byte) ;
感谢您的回答,它并没有直接解决我的问题,而是让我找到了解决方案。
解决方法:
尽管我没有向 MCU 发送任何内容,但我收到了 255 个值。
但:
如果没有接收到字节,则 LUFA CDC_Device_ReceiveByte-function returns -1。我忘了在 serial_byte &= 0x00FF; 之前检查那个值;陈述。然后混合了 -1 值,结果是 255 值。
又是一个愚蠢的错误,又浪费了我很多时间。
我希望这不是一个愚蠢的问题,但我自己找不到问题的答案。
我正在研究 Atmega32U4 微控制器设备,它应该接收一系列字节并存储它们。我的代码基于 LUFA-Library 151115 中的 CDC 虚拟串行驱动程序模板。为了测试我的代码,我使用了非常有用的工具 ScriptCommunicator 04.11。微控制器单元 (MCU) 通过 USB 连接到 PC,并被 PC 主机视为串行 com 端口设备。我的 OS 是 Windows 7 64 位。
目前,我正在编写一个函数,其中应接收和存储六个值。 为此,我使用以下代码:
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(&VirtualSerial_CDC_Interface);
serial_byte &= 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(&VirtualSerial_CDC_Interface);
USB_USBTask();
loop ++ ;
printf("%i" PRId32 "\n", serial_byte) ;
_delay_ms(1000);
} while (loop < 7);
我之前使用过类似的代码片段,一切似乎都运行良好。现在我发现了以下问题: 设备不断收到值“255ld”。因为当我用 ScriptCommunicator 测试上面的代码时,我收到了这个值六次(这就是上面代码中包含 printf 语句的原因)。
我怀疑发生这种情况是因为 Windows 将 MCU 视为普通 USB 设备,例如一个鼠标?难道是这样吗?
或者这可能是什么原因?
我该如何解决我的问题?
提前感谢您的任何提示和回答!
格式使用错误。
int16_t serial_byte = 0;
// v (remove i)
// printf("%i" PRId32 "\n", serial_byte) ;
// 16 not 32
printf("%" PRId16 "\n", serial_byte) ;
感谢您的回答,它并没有直接解决我的问题,而是让我找到了解决方案。
解决方法: 尽管我没有向 MCU 发送任何内容,但我收到了 255 个值。 但: 如果没有接收到字节,则 LUFA CDC_Device_ReceiveByte-function returns -1。我忘了在 serial_byte &= 0x00FF; 之前检查那个值;陈述。然后混合了 -1 值,结果是 255 值。 又是一个愚蠢的错误,又浪费了我很多时间。