OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2918|回复: 7

USB虚拟串口发送数据丢失

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-20
在线时间
2 小时
发表于 2017-5-20 17:42:34 | 显示全部楼层 |阅读模式
1金钱
我用的库函数版《实验48 USB虚拟串口实验》的程序,只是改了下主程序部分,发送数据量的话,大概是每秒发送1400次,每次7个数据,这个样子,硬件的话是我自己做的STM32F103T8板子,使用USB_USART_SendData函数发送数据,发现有数据丢失的情况,目前还没有看到有什么丢失规律,有时候只丢一个数据,有时候丢得就比较多了,望各位帮帮忙

最佳答案

查看完整内容[请看2#楼]

考虑波特率和传输速度。MCU如果猛发数据,我们的代码是没做数据溢出检测的。所以可能存在丢失数据的情况。 建议:提高波特率,或者降低发送速度
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-20 17:42:35 | 显示全部楼层
考虑波特率和传输速度。MCU如果猛发数据,我们的代码是没做数据溢出检测的。所以可能存在丢失数据的情况。
建议:提高波特率,或者降低发送速度
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

50

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1011
金钱
1011
注册时间
2016-10-28
在线时间
82 小时
发表于 2017-5-20 17:44:10 | 显示全部楼层
应该一步一步调试,先发送少量数据,逐次查找
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-20
在线时间
2 小时
 楼主| 发表于 2017-5-22 10:22:43 | 显示全部楼层
本帖最后由 nanjifeizhu 于 2017-5-22 17:01 编辑

2017052211:00今天测试发现丢失数据时,发现uu_txfifo.buffer[]中有丢失数据--------更正,2017052217:00现在测试发现问题不在这个地方
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-20
在线时间
2 小时
 楼主| 发表于 2017-5-22 20:05:32 | 显示全部楼层
20170522 20:00:
将代码改为如下代码测试,在test_usb_buffer_error=1行设置断点,数据丢失时,并不会触发断点
u8 test_usb_buffer[100];
u8 test_usb_i;
u8 test_usb_buffer_error;
void EP1_IN_Callback (void)
{
        u16 USB_Tx_ptr;
        u16 USB_Tx_length;
        if(uu_txfifo.readptr==uu_txfifo.writeptr)                //无任何数据要发送,直接退出
        {
                return;
        }
        if(uu_txfifo.readptr<uu_txfifo.writeptr)                //没有超过数组,读指针<写指针
        {
                USB_Tx_length=uu_txfifo.writeptr-uu_txfifo.readptr;//得到要发送的数据长度
        }else                                                                                        //超过数组了 读指针>写指针
        {
                USB_Tx_length=USB_USART_TXFIFO_SIZE-uu_txfifo.readptr;//得到要发送的数据长度
        }
        if(USB_Tx_length>VIRTUAL_COM_PORT_DATA_SIZE)        //超过64字节?
        {
                USB_Tx_length=VIRTUAL_COM_PORT_DATA_SIZE;        //此次发送数据量
        }
        USB_Tx_ptr=uu_txfifo.readptr;                                        //发送起始地址               
        uu_txfifo.readptr+=USB_Tx_length;                                //读指针偏移  
        if(uu_txfifo.readptr>=USB_USART_TXFIFO_SIZE)        //读指针归零
        {
                uu_txfifo.readptr=0;
        }
        UserToPMABufferCopy(&uu_txfifo.buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
        PMAToUserBufferCopy(test_usb_buffer,ENDP1_TXADDR,USB_Tx_length);
        for(test_usb_i=0;test_usb_i<USB_Tx_length;test_usb_i++)
        {
                if(uu_txfifo.buffer[USB_Tx_ptr+test_usb_i]!=test_usb_buffer[test_usb_i])
                {
                        test_usb_buffer_error=1;
                }
        }

        SetEPTxCount(ENDP1, USB_Tx_length);
        SetEPTxValid(ENDP1);   
}
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2017-5-22 20:20:39 | 显示全部楼层

往缓冲区填数据的时候,要注意缓冲区有多大空间,能填多少数据。

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-20
在线时间
2 小时
 楼主| 发表于 2017-5-23 16:02:16 | 显示全部楼层
xuande 发表于 2017-5-22 20:20
往缓冲区填数据的时候,要注意缓冲区有多大空间,能填多少数据。

昨天测试过了,缓冲区uu_txfifo.buffer数据没有丢失
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2018-4-13
在线时间
11 小时
发表于 2018-5-4 16:06:33 | 显示全部楼层
请问你问题解决了吗,我也是这样的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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