使用LUFA作为字符串传输的CDC

时间:2012-01-09 17:21:34

标签: c usb avr atmel winavr

我试图将我的AT90USB162(Minimus USB板)用作CDC,以便将常量字符串发送到连接到comport的超级终端。 所以我得到了演示代码Demos / Device / ClassDriver / VirtualSerial并进行了一些更改:

在makefile中

MCU = at90usb162
BOARD = MINIMUS
F_CPU = 16000000

在VirtualSerial.h中

  • 删除了与Joystick.h相关的所有条目,因为AT90USB162没有它
  • 创建了functon SendSpecificString()的标题(以换取与Joystick.h相关的旧CheckJoystickMovement())

在VirtualSerial.c中

来自SetupHardware():删除了对Joystick_Init()的调用,因此新代码是(没有注释)。

void SetupHardware(void)
{
    MCUSR &= ~(1 << WDRF);
    wdt_disable();
    clock_prescale_set(clock_div_1);
    LEDs_Init();
    USB_Init();
}

删除了void CheckJoystickMovement(void)并根据第一个创建了void SendSpecificString(void),但没有操纵杆的东西:

void SendSpecificString(void)
{
    char*       ReportString  = "data packet";
    static bool ActionSent    = false;

    if ((ReportString != NULL) && (ActionSent == false))
    {
        ActionSent = true;
        fputs(ReportString, &USBSerialStream);
    }
}

最后在main()中:将CheckJoystickMovement()调用交换到void SendSpecificString()调用。

int main(void)
{
    SetupHardware();
    CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
    LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
    sei();

    for (;;)
    {
        SendSpecificString();
        CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
        CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
        USB_USBTask();
    }
}

因此,代码构建并将其刻录到AT90USB162并启用它。这个comport(在我的情况下是#6)出现了,我可以从超级终端连接到它(我大多数时候使用HypoTerminal,但是Microsoft Hyperterminal也会出现相同的结果)。当我连接到comport时,终端不会像预期的那样卡住,但是我也期望字符串ReportString =&#34;数据包&#34;会出现在超级终端中,但实际上什么都没有出现。然后,我会错过什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

我刚刚发现问题不在于fputs或CDC_Device_SendString调用。条件循环不是必需的,在这种情况下足以使

void SendSpecificString(void)
{
    char*       ReportString  = "data packet\r\n";
    fputs(ReportString, &USBSerialStream);
}

就是这样。