STM32 USB虚拟串口与PC机软件实现流控出错

Linux-OS Linux-OS 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
使用平台:STM32F103R8T6.
USB虚拟串口已经成功,想实现PC机端软件发送数据到 EP3,接收到的数据直接写入FLASH。EP1来实现向PC机发送0XAA,实现流控制。
但是一直有问题。不知道什么原因。

端点配置如下:

usb_prob.c文件:

/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);

/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_BULK);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS);

/* Initialize Endpoint 2 */
SetEPType(ENDP2, EP_INTERRUPT);
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
SetEPRxStatus(ENDP2, EP_RX_DIS);
SetEPTxStatus(ENDP2, EP_TX_NAK);

/* Initialize Endpoint 3 */
SetEPType(ENDP3, EP_BULK);
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
SetEPRxCount(ENDP3, VIRTUAL_COM_PORT_DATA_SIZE);
SetEPRxStatus(ENDP3, EP_RX_VALID);
SetEPTxStatus(ENDP3, EP_TX_DIS);

usb_endp.c文件:

void EP1_IN_Callback()
{
uint8_t pDat[64];

pDat[0] = 0xAA;

UserToPMABufferCopy(pDat, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);

}

/*******************************************************************************
* Function Name : EP3_OUT_Callback
* Description :
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP3_OUT_Callback(void)
{

/* Get the received data buffer and update the counter */
USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);

FLASH_Unlock();
EE_BufferWrite(WriteAddr,USB_Rx_Cnt,USB_Rx_Buffer);
WriteAddr += USB_Rx_Cnt;
//USBSendDataFlag = 1;
SetEPTxValid(ENDP1);

/* Enable the receive of data on EP3 */
SetEPRxValid(ENDP3);

}
出现PC机端软件读取虚拟串口数据,不能读到0XAA。PC机软件采用C#编写。

如果把SetEPTxValid(ENDP1);放在void EP1_IN_Callback()中PC机端软件就能收到数据0xAA。但是放在EP3_OUT_Callback中就不能收到数据。
实现这种方式主要是因为PC机端上位机软件将数据发送到虚拟串口,下位机直接将其写入FLASH。不加流控就会出现数据覆盖。0xAA就是用来告诉PC机,先不要再发了,等数据写入FLASH再继续发送64字节数据。
...全文

相关推荐

31-MCU与PC互相串行通讯.zip

通过protues搭建单片机外围电路,keil编写单片机串口通信代码,实现MCU和PC互相串行通信,亲测能用,有需要的可以拿去,谢谢!

qq_43535184

STM32F407 USB通信与虚拟串口CDC类开发实战

本文还有配套的精品资源,点击获取 简介:本项目详细介绍如何使用STM32F407微控制器,通过USB接口实现设备通信并模拟虚拟串口。项目涵盖了USB Device模式的配置、CDC类设置、以及利用Cubemx生成初始化代码的完整流程。最终实现STM32F407作为USB CDC设备,与PC或其他USB主机之间的高速数据交换,具有广泛的实际应用潜力。 1. STM3...

微尘-黄含驰

STM32 USB通信配置:手把手教程(从零实现)

深入讲解STM32芯片的usb通信配置全过程,适合初学者一步步掌握硬件连接与代码编写,轻松实现稳定usb通信功能。

Fkvision

STM32CubeMX固件包下载中的USB驱动集成方法

详解如何在STM32CubeMX固件包下载过程中集成USB驱动,提升开发效率。结合实际操作步骤,帮助开发者快速配置并部署嵌入式项目中的USB功能。

深渊号角~~~

STM32 USB CDC虚拟串口实战:从原理到高速数据采集应用

串口通信是嵌入式系统与上位机交互的基础技术,通过异步传输实现设备间的数据交换。其工作原理基于起始位、数据位和停止位的帧结构,在嵌入式调试、设备控制和数据采集中具有不可替代的价值。随着对传输速率和系统集成度要求的提升,传统UART接口在高速数据传输场景中面临瓶颈。USB通信设备类(CDC)技术应运而生,它利用USB总线的高带宽和即插即用特性,在物理层实现高速可靠的数据传输,同时在上层软件接口完全兼容传统串口操作。基于CDC ACM子类的虚拟串口(VCP)方案,允许微控制器通过USB接口直接被识别为串口设备,无

weixin_33749131
评论 5
收藏 已收藏
分享
返回顶部
Linux-OS
单片机/工控 27,522 成员 28,796 内容