STM32CubeIDE跨文件传递串口字符串后LED控制失效问题
缺少字符串终止符
strcmp依赖以'\0'结尾的C字符串做比较,但USB CDC接收的Buf是原始字节流,不会自动添加终止符。直接用memcpy复制后,serialCopy里只有接收的字符(比如'1'对应0x31),后续是未初始化的垃圾数据,strcmp会读到内存中随机的'\0'才停止,导致比较结果错误。
解决:复制后手动添加终止符(确保数组大小比最大接收长度多1):memcpy(serialCopy, Buf, len); serialCopy[len] = '\0';中断回调与主循环的同步问题
CDC_Receive_FS是USB中断触发的回调函数,和主循环执行时机异步。如果没有同步机制,主循环可能在memcpy未完成时就读取serialCopy,或者回调在主循环处理数据时覆盖内容,导致读取到不完整/错误数据。
解决:定义全局标志位,回调完成复制后置位标志,主循环检查到标志位再处理数据,处理完清零:// 全局变量 uint8_t serial_data_ready = 0; // CDC_Receive_FS中 memcpy(serialCopy, Buf, len); serialCopy[len] = '\0'; serial_data_ready = 1; // main循环中 if(serial_data_ready) { // 处理LED逻辑 serial_data_ready = 0; }extern声明或数组大小错误
检查serialCopy的声明匹配性:main.c中定义的数组(比如uint8_t serialCopy[10];),在usbd_cdc_if.c的extern声明必须完全一致,不能写错变量名或长度。另外数组需预留至少1个字节放终止符,否则会内存越界破坏其他变量。串口数据包含额外字符
多数串口助手默认会在发送字符后自动加换行('\n')或回车('\r'),比如发送'1'实际接收的是"1\r\n",此时strcmp(serialCopy, "1")必然不相等。
解决:要么关闭串口助手自动换行,要么修改判断逻辑:比如直接判断第一个字符if(serialCopy[0] == '1'),或者用strncmp(serialCopy, "1", 1)指定比较长度。memcpy参数错误
memcpy的第三个参数必须是CDC接收的实际字节数(即CDC_Receive_FS的len参数),如果传成数组总长度,会把Buf中未使用的旧数据也复制过去,导致serialCopy内容混乱。
内容的提问来源于stack exchange,提问作者Some Student

