欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

stm32 usb虚拟串口与pc机软件实现流控疏失

更新时间: 2014-01-05 03:14:09 责任编辑: Author_N1

 

STM32 USB虚拟串口与PC机软件实现流控出错
使用平台: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字节数据。
--参考方法--
玩的这么牛!
--参考方法--
你的逻辑不对,应该是STM写完flash告诉PC机你继续发,不该告诉PC机你先不要发。
--参考方法--
你每次发数据当然要SetEPTxValid(ENDP1);,不然 数据怎么能发送出去
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:14:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/19859/
本文WWW.DOC100.NET DOC100.NET版权所有。