硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1068|回复: 2
收起左侧

rl_usb发送数据截断现象

[复制链接]

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2021-2-17 10:38:23 | 显示全部楼层 |阅读模式
看看有这么一个现象哈。我PC下发USB数据命令A0 然后单板接收到以后,会回复数据,一个测试数据,16Bytes,其中前8个是一样的,顺序递增的。后8个0
然后在长时间数据交互时,会出现单板返回的数据被截断的现象(图片无法上传,我稍后试试看)手动描述就是
Device  Address              Length    Phase  Data                      Description       Cmd.Phase.Ofs(rep)
------  -------------------  --------  -----  ------------------------  ----------------  ------------------
  31.2                              8  OUT    a0 00 00 00  00 00 00 00  ........               117.1.0        
  31.2                             16  IN     72 72 72 72  72 72 72 72  rrrrrrrr               118.1.0        
                                                   00 00 00 00  00 00 00 00  ........               118.1.8        
  31.2                              8  OUT    a0 00 00 00  00 00 00 00  ........               119.1.0        
  31.2                             16  IN     73 73 73 73  73 73 73 73  ssssssss               120.1.0        
                                                   00 00 00 00  00 00 00 00  ........               120.1.8        
  31.2                              8  OUT    a0 00 00 00  00 00 00 00  ........               121.1.0        
  31.2                             15  IN     74 74 74 74  74 74 74 74  tttttttt               122.1.0        
                                                   00 00 00 00  00 00 00     .......                122.1.8        
  31.2                              8  OUT    a0 00 00 00  00 00 00 00  ........               123.1.0        
  31.2                             17  IN     00 75 75 75  75 75 75 75  .uuuuuuu               124.1.0        
                                                    75 00 00 00  00 00 00 00  u.......               124.1.8        
                                                   00                        .                      124.1.16      
  31.2                              8  OUT    a0 00 00 00  00 00 00 00  ........               125.1.0        
  31.2                             16  IN     76 76 76 76  76 76 76 76  vvvvvvvv               126.1.0        
                                                   00 00 00 00  00 00 00 00  ........               126.1.8   


在发送72和73的时候时候可以的,然后到74的时候,最后一个0被截断了没有发送。在下一次发送75的时候,发送了上次少发送的那个0.导致75的这次数据长度比正常的多一个
然后76又正常了



单板返回代码:
                case 0xA0:
                {
                    //printf("接收A0测试命令,返回序列数据\n");

                    //printf("[USB] updata monitor data -> %d\r\n",index);
                    for(i = 0; i < 8; i++)
                    {
                        UsbSendBuf = index;
                    }

                    index ++;
                    iLen = USBD_CDC_ACM_DataSend(UsbSendBuf, 16);
                    if(iLen != 16)
                    {
                        printf("[USB] Send monitor data Length(%d) ERROR !=16 \r\n",iLen);
                    }
                    break;
                }


想问的是, USBD_CDC_ACM_DataSend是把数据放到rl-usb协议的一个发送缓存区,这个数据发送被中断了,是和我rtx系统的任务切换有关系吗?
还是有其他地方可以保证我写入到这个发送缓存区的数据一定会被发送完成的?



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-2-17 11:21:26 | 显示全部楼层
我这里有个完整的回环,你可以参考

基于RL-USB实现ESP8266快速更新固件程序备份(2019-07-17)
http://www.armbbs.cn/forum.php?m ... 4477&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2021-2-18 09:50:00 | 显示全部楼层
eric2013 发表于 2021-2-17 11:21
我这里有个完整的回环,你可以参考

基于RL-USB实现ESP8266快速更新固件程序备份(2019-07-17)

Bus Hound 6.01 capture on Windows Vista (x64). Complements of www.perisoft.net

  Device - Device ID (followed by the endpoint for USB devices)
            (31) PLC_Capture_Control
  Length - Total transfer length
  Phase  - Phase Type
            IN    Data in transfer           
            OUT   Data out transfer         
  Data   - Hex dump of the data transferred
  Descr  - Description of the phase
  Cmd... - Position in the captured data


Device  Length    Phase  Data                      Description       Cmd.Phase.Ofs(rep)
------  --------  -----  ------------------------  ----------------  ------------------
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                 1.1.0        
  31.2         2  IN     00 81                     ..                       2.1.0        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                 3.1.0        
  31.2        16  IN     00 00 00 00  00 00 00 00  ........                 4.1.0        
                         00 00 00 00  00 00 00 00  ........                 4.1.8        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                 5.1.0        
  31.2        14  IN     01 01 01 01  01 01 01 01  ........                 6.1.0        
                         00 00 00 00  00 00        ......                   6.1.8        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                 7.1.0        
  31.2         2  IN     00 00                     ..                       8.1.0        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                 9.1.0        
  31.2        16  IN     02 02 02 02  02 02 02 02  ........                10.1.0        
                         00 00 00 00  00 00 00 00  ........                10.1.8        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                11.1.0        
  31.2        14  IN     03 03 03 03  03 03 03 03  ........                12.1.0        
                         00 00 00 00  00 00        ......                  12.1.8        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                13.1.0        
  31.2        18  IN     00 00 04 04  04 04 04 04  ........                14.1.0        
                         04 04 00 00  00 00 00 00  ........                14.1.8        
                         00 00                     ..                      14.1.16      
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                15.1.0        
  31.2        14  IN     05 05 05 05  05 05 05 05  ........                16.1.0        
                         00 00 00 00  00 00        ......                  16.1.8        
  31.2         8  OUT    a0 00 00 00  00 00 00 00  ........                17.1.0        
  31.2        18  IN     00 00 06 06  06 06 06 06  ........                18.1.0        
                         06 06 00 00  00 00 00 00  ........                18.1.8        
                         00 00                     ..                      18.1.16      


看了下您工程里面用的发送函数是USBD_CDC_ACM_PutChar,采用单字符发送。但是在帮助文档里面,我觉得效果应该是一样的
USBD_CDC_ACM_PutChar
Summary #include <RTL.h>
#include <rl_usb.h>

int32_t USBD_CDC_ACM_PutChar (
    const uint8_t ch );            /* Character to be sent */

Description The function USBD_CDC_ACM_PutChar puts the requested character ch to the intermediate buffer and prepares it for being sent over the Virtual COM Port.

The function is part of the USB Device Function Driver layer of the RL-USB Device Software Stack.

Return Value -1 - Function failed
ch - Function succeeded

都是发送了到他内部的缓存中。

我试验了一下在usb_config.c里面把发送和接收的缓存从1024修改成64以后,数据被截断的现象明显增多。
这个数据截断发送应该是rl-usb协议栈自动周期发送的感觉。定时的? 数据量到了一定的长度就先发送。
bulk方式发送
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 17:38 , Processed in 0.191806 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表