求助:使用CCS C编译器连接PIC18F4550至串口监视器遇输出截断
PIC18F4550 USB-CDC 串口输出截断问题解决
原始代码
#include <18F4550.h> // 包含微控制器库 #use delay(clock=48MHz, crystal) // 定义振荡器类型和频率 #build(reset=0x02000, interrupt=0x02008) // 指定复位和中断向量地址 #org 0x0000, 0x1FFF {} // 为bootloader预留内存区域 #fuses HSPLL, CPUDIV1, NOWDT, NOPROTECT, PLL5, NODEBUG, USBDIV, VREGEN #include <usb_cdc.h> // USB-CDC库 void main(void) { usb_cdc_init(); // 配置虚拟串口 usb_init(); // 初始化USB栈 // 主循环 while (1) { usb_task(); // 维持USB栈运行 // 通过USB-CDC发送消息 printf(usb_cdc_putc, "Hola mundo, ¿cómo estás? "); delay_ms(4000); // 等待4秒后再次发送 } }
问题现象

使用CCS C编译器开发PIC18F4550的USB-CDC功能时,串口监视器能收到输出但内容被截断,无法查看完整消息。
解决方案
1. 代码层面优化
修改代码,增加USB连接状态检查,采用逐字符发送确保数据完整:
#include <18F4550.h> #use delay(clock=48MHz, crystal) #build(reset=0x02000, interrupt=0x02008) #org 0x0000, 0x1FFF {} #fuses HSPLL, CPUDIV1, NOWDT, NOPROTECT, PLL5, NODEBUG, USBDIV, VREGEN #include <usb_cdc.h> void main(void) { usb_cdc_init(); usb_init(); while (1) { usb_task(); // 仅在USB设备完成枚举且主机打开串口时发送数据 if(usb_cdc_connected()) { const char msg[] = "Hola mundo, ¿cómo estás?\r\n"; // 逐字符发送并等待发送完成 for(int i=0; msg[i] != '\0'; i++){ while(!usb_cdc_putc(msg[i])); } delay_ms(4000); } } }
关键修改说明:
usb_cdc_connected():避免在USB未连接或未枚举完成时发送数据,减少数据丢失概率- 逐字符发送+等待确认:确保每个字符都被USB栈正确处理,避免一次性发送过多数据超出内部缓冲区
- 规范换行符:使用
\r\n替代不规范的换行,适配绝大多数串口监视器的换行解析
2. 硬件与工具检查
- 确认USB线缆质量:使用屏蔽良好的USB线,避免干扰导致数据传输中断
- 串口监视器设置:无需手动设置波特率(USB-CDC为虚拟串口),但需确保工具已正确识别PIC的USB设备
- 熔丝配置验证:确认
VREGEN熔丝已开启,保证USB模块供电稳定 - Bootloader内存区域:确保
#org 0x0000, 0x1FFF {}预留的内存与实际使用的bootloader大小匹配,避免代码覆盖导致功能异常
内容的提问来源于stack exchange,提问作者PUENTE ELIZONDO JESUS EDUARDO
相关产品推荐
相关产品推荐

