你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 USB 发送数据 上位机接受不到

[复制链接]
憨客鱼 提问时间:2026-4-3 16:07 / 未解决

用的是 STM32F407 芯片 ,使用USB 和上位机通讯

在一个函数里

switch(g_stUsbGet.ucData[3])

{ case CMD_COMM_GETUSB: printf("\n Acmd 1"); HAL_Delay(60000); printf("\n cmd 1"); UsbCom_Usb_GetUsb(); break;

接受到上位机发送的数据后,然后执行相应的操作后,再返回数据,结果发现一个问题,当这个执行操作时间很长的时候,返回数据上位机接受不到了,我做了一个测试程序,只加1分钟延时,结果是一样的,

UsbCom_Usb_GetUsb(); 函数里有CDC_Transmit_FS(pData+usIndex,ucLen)函数,

当上面的 HAL_Delay(60000) 去掉的时候,上位机接受数据没有问题,但是加这个延时,上位机就接受不到了,上位机也加一个延时再收,也还是收不到,我用BUSHOUND做试验,也是一样的,无论我读数据是发送后马上去读,还是等下位机发送后再读,都是一样的结果,不知道这个是什么原因啊

收藏 评论9 发布时间:2026-4-3 16:07

举报

9个回答
fafa1 回答时间:2026-4-3 17:38:01

是上位机有超时时间,超时 就不接收了?或者接收直接扔掉了?

CM_STM32 回答时间:2026-4-3 18:50:18

你的UsbCom_Usb_GetUsb()的具体实现是什么

憨客鱼 回答时间:2026-4-5 09:45:55

fafa1 发表于 2026-4-3 17:38
是上位机有超时时间,超时 就不接收了?或者接收直接扔掉了?

有超时时间 但是 我加延时 再接受一样接受不到

憨客鱼 回答时间:2026-4-5 09:47:42

CM_STM32 发表于 2026-4-3 18:50
你的UsbCom_Usb_GetUsb()的具体实现是什么

void UsbCom_Send_Fun(unsigned char *pData,unsigned short int usLen) { unsigned char ucLen; unsigned char ret,ret1; unsigned short int usIndex;

ret = TRUE;

usIndex=0; do { if(usLen>64) { ucLen = 64; usLen = usLen -64; } else { ucLen = usLen; ret = FALSE; } g_ucUsbSendSta=TRUE; g_usUsbSendTimIndex=0; g_ucUsbSendTimFlag = TRUE; do { ret1=TRUE;

    if(CDC_Transmit_FS(pData+usIndex,ucLen)!=USBD_OK)
    {
        HAL_Delay(10);
        ret1 = FALSE;
    }
    //--------------------------

/ if(ucLen==64) { CDC_Transmit_FS(pData+usIndex,0); } //------------------------- /

}while(ret1==FALSE);
usIndex = usIndex+ucLen;

}while(ret == TRUE);

printf("\n send ok "); }

CM_STM32 回答时间:2026-4-5 18:13:22

你试试改成状态机写法或者直接上RTOS,usb状态可能因为Delay而不更新

憨客鱼 回答时间:2026-4-7 09:17:36

CM_STM32 发表于 2026-4-5 18:13
你试试改成状态机写法或者直接上RTOS,usb状态可能因为Delay而不更新
...

没太明白,状态机写法是什么

憨客鱼 回答时间:2026-4-8 10:09:49

CM_STM32 发表于 2026-4-5 18:13
你试试改成状态机写法或者直接上RTOS,usb状态可能因为Delay而不更新
...

我感觉应该是 你说的函数延时太长造成USB 更新不及时,但是 我没再 main 函数里找到 USB 的主函数,我的理解,USB 的状态 更新要么在MAIN里有一个 USB 主函数负责USB状态更新,要么就是通过USB中断实现,我检查过,我USB 的中断优先级已经设置成了0,如果是中断负责USB状态更新,那我延时多少也不应该有问题啊

CM_STM32 回答时间:2026-4-8 18:11:17

憨客鱼 发表于 2026-4-8 10:09
我感觉应该是 你说的函数延时太长造成USB 更新不及时,但是 我没再 main 函数里找到 USB 的主函数, ...

[md]确实,暂时没看明白是哪里出问题了

憨客鱼 回答时间:2026-4-9 08:55:15

没人知道原因么

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版