OpenEdv-开源电子网

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

stm32f1 USB虚拟串口速率

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-11-4
在线时间
12 小时
发表于 2017-11-29 11:28:55 | 显示全部楼层 |阅读模式
5金钱
原子哥,我用你的USB虚拟串口例程实现了stm32的USB虚拟串口,能够与上位机ATK XCOM串口调试助手通讯,效果挺好的。但是现在有个活,要求单片机与PC的通讯速率在200KB/S(字节),我用那个USB虚拟串口的例程粗略测试了一下速度,发现速率不到60KB/S。我在网上看到有人说USB每1ms产生一次端点中断,如果这样的话,每次发送的数据包是64Byte,那么最大速率是不是只有64KB/S?
但是我看网上有人说能达到600多K,难道是实现的原理不一样吗,或者是怎么修改例程能提高速率呢,本人对USB实在是不太了解,所以特来请教原子哥和各位大神,希望各位不吝赐教,多谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-30 01:08:35 | 显示全部楼层
波特率你设置到多高了?
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-11-4
在线时间
12 小时
 楼主| 发表于 2017-12-1 10:58:19 | 显示全部楼层
正点原子 发表于 2017-11-30 01:08
波特率你设置到多高了?

stm32上使能了串口1,波特率115200,然后在ATK XCOM上的波特率设置过最大的1382400,但是在XCOM上设置的波特率好像对虚拟串口的速率没有影响
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2017-12-1 18:29:03 | 显示全部楼层
讲道理,虚拟串口物理上是USB,USB能跑多快它就能有多快;但是逻辑上还是串口,如果你波特率设置低的话肯定影响应用时的数据通信速率。

我没有那么高的通信速率需求所以也没仔细研究过,不过我觉得,你若是想实现所要实现的波特率,最好还是沉下心来去看看那些大神的帖子,补补USB底层的知识。
十六进制带我飞。
回复

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2018-5-4 16:36:14 | 显示全部楼层
我也遇到了一样的问题,测试出来每秒差不多只能发送一千个数据包,我的每个包是21个字节,可以怎么提高这个USB虚拟串口每秒发送的数据包数吗?

我的程序是通过 Cube 生成的,主要配置如下,然后直接调用发送函数:CDC_Transmit_FS(usb_send_buff, BUFF_SIZE_TX)
USB_conf.jpg
USB_Device_conf.jpg
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-5-5 18:56:35 来自手机 | 显示全部楼层
那个中断端口触发后,启动的那个数据模式,可以多发点,一次64,但是你可以发好几次呀~间隔还是1ms
回复

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2018-6-4 15:47:40 | 显示全部楼层
孟亮 发表于 2018-5-5 18:56
那个中断端口触发后,启动的那个数据模式,可以多发点,一次64,但是你可以发好几次呀~间隔还是1ms

(不好意思,现在才发现你的回复
你指的中断端口触发是指哪个中断呢?启动的数据模式又是哪里?麻烦了~
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-6-5 10:48:53 | 显示全部楼层
旦丁中号 发表于 2018-6-4 15:47
(不好意思,现在才发现你的回复)
你指的中断端口触发是指哪个中断呢?启动的数据模式又是哪里?麻烦 ...

void SOF_Callback(void) 这个函数就是 每次中断触发的回调,
void EP(x)_IN_Callback(void) 是端点发送回调,这俩配合好了,#define USART_RX_DATA_SIZE 1024  再放大点,速度提升很明显。
用中断 触发 发送,发送回调继续触发发送,再回调,再发直到发送完成。这样那个1ms 或5ms 间隔就仅与第一次发送有关,后续的都是连续进行的,理论上应该可以达到虚拟SD卡或虚拟U盘的传输速度。甚至于更快,因为没有 SCSI码解析的内容。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 21:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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