使用 LUFA 作为 CDC 进行字符串传输

Posted

技术标签:

【中文标题】使用 LUFA 作为 CDC 进行字符串传输【英文标题】:Using LUFA as CDC for String Transmission 【发布时间】:2012-01-09 17:21:33 【问题描述】:

我正在尝试将我的 AT90USB162(Minimus USB 板)用作 CDC,以将常量字符串发送到连接到 comport 的超级终端。 于是我拿到了演示代码Demos/Device/ClassDriver/VirtualSerial并做了一些修改:

在makefile中

MCU = at90usb162
BOARD = MINIMUS
F_CPU = 16000000

在 VirtualSerial.h 中

删除了所有与 Joystick.h 相关的条目,因为 AT90USB162 没有它 创建了函数 SendSpecificString() 的标头(作为与 Joystick.h 相关的旧 CheckJoystickMovement() 的交换)

在 VirtualSerial.c 中

来自 SetupHardware():删除了对 Joystick_Init() 的调用,因此新代码是(不带 cmets)。

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 超级终端也会出现相同的结果)。当我连接到 comport 时,终端并没有像预期的那样卡住,但是我也希望字符串 ReportString = "data packet" 会在超级终端中连续出现,但实际上什么也没出现。那么,我会错过什么?

谢谢。

【问题讨论】:

尝试检查您的终端程序中的比特率是否与MCU板的传输率匹配。 【参考方案1】:

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

void SendSpecificString(void)

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

就是这样。

【讨论】:

以上是关于使用 LUFA 作为 CDC 进行字符串传输的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CDC 协议测量 USB 传输速度?

Linux USB CDC 发送意外字符

flink cdc debezium 读取decimal为字符串问题

在 node.js 中从字符串创建一个文本文件并将其作为响应流式传输

如何在greenplum中实施CDC?

在windows 与Linux间实现文件传输(C++&C实现)