发新帖我要提问
12
返回列表
打印
[STM32F2]

F205 虚拟串口通信可靠性问题

[复制链接]
楼主: seawwh
手机看帖
扫描二维码
随时随地手机跟帖
21
seawwh|  楼主 | 2016-12-29 09:33 | 只看该作者 回帖奖励 |倒序浏览
Xflyan 发表于 2016-12-28 17:55
不是这里的代码问题,检查一下你的 USB中断 Callback 的那几个函数,也就是USB从 buffer 取数据的过程 ...

为了缩小故障的范围,我使用的代码全部出自ST 最新库中的 VCP Demo。中断, CallBack 均没有修改。
仅仅修改了下列函数,便于测试:

static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
  uint32_t i;
  for (i=0; i<Len; i++) {
    APP_Rx_Buffer[APP_Rx_ptr_in++]=Buf;
    if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
      APP_Rx_ptr_in = 0;
  }  
  return USBD_OK;
}

uint8_t  Bu[8192];
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len) {

  uint32_t  Cnt;
  Cnt=Buf[0]+((u16)Buf[1]<<8);  // 收到的长度信息L
  VCP_DataTx( Bu, Cnt);         // 回发数据包
  return USBD_OK;
}

使用特权

评论回复
22
seawwh|  楼主 | 2016-12-29 09:33 | 只看该作者
Xflyan 发表于 2016-12-28 17:55
不是这里的代码问题,检查一下你的 USB中断 Callback 的那几个函数,也就是USB从 buffer 取数据的过程 ...

为了缩小故障的范围,我使用的代码全部出自ST 最新库中的 VCP Demo。中断, CallBack 均没有修改。
仅仅修改了下列函数,便于测试:

static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
  uint32_t i;
  for (i=0; i<Len; i++) {
    APP_Rx_Buffer[APP_Rx_ptr_in++]=Buf;
    if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
      APP_Rx_ptr_in = 0;
  }  
  return USBD_OK;
}

uint8_t  Bu[8192];
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len) {

  uint32_t  Cnt;
  Cnt=Buf[0]+((u16)Buf[1]<<8);  // 收到的长度信息L
  VCP_DataTx( Bu, Cnt);         // 回发数据包
  return USBD_OK;
}

使用特权

评论回复
23
Xflyan| | 2016-12-29 13:46 | 只看该作者
seawwh 发表于 2016-12-29 09:33
为了缩小故障的范围,我使用的代码全部出自ST 最新库中的 VCP Demo。中断, CallBack 均没有修改。
仅仅修 ...

按你说的,缓冲区折回会出现错误,那你这个代码就可以测试一下到底是不是

static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) {

  APP_Rx_ptr_out= 4086;
  APP_Rx_ptr_in = (4086+Len) % APP_RX_DATA_SIZE;
  return USBD_OK;
}

你要发 4106字节,8192的 buffer,指向的位置分为小于或者大于(8192 - 4106)

我前面说的就是你的USB取数据时可能出现折回计数错误

使用特权

评论回复
24
Stannis| | 2016-12-29 21:01 | 只看该作者
缓冲区不溢出,直接往缓冲区填数据应该没问题

使用特权

评论回复
25
seawwh|  楼主 | 2016-12-31 14:15 | 只看该作者
2016.12.31 试验得到的规律

  使用官方程序 8192 Buff
  每次传输报文长度 Len=4106,下列触发条件
  APP_Rx_ptr_in=APP_Rx_ptr_out=4096;
  APP_Rx_ptr_in= (APP_Rx_ptr_in+Len) % APP_RX_DATA_SIZE;

  通过改变CDC_IN_FRAME_INTERVAL测试
  当:CDC_IN_FRAME_INTERVAL=1,2,4,5  必错, =3时 几包可以正确
  >6 之后可靠性上升很多,几乎不出错(10万次发送)。
  出错现象:只收到4096字节。

  CDC_IN_FRAME_INTERVAL 是用于控制开始传输的间隔,与SOF同步间隔,这个数据愈大通信效率愈低。
  但是无法解释此现象。

  请教: Full Speed 情况下Bulk 传输1ms内会Host最多发几个In 令牌?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则