使用 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 进行字符串传输的主要内容,如果未能解决你的问题,请参考以下文章
flink cdc debezium 读取decimal为字符串问题