硬汉嵌入式论坛

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

[ThreadX全家桶] USBX CDC发送不正常。

[复制链接]

26

主题

181

回帖

259

积分

高级会员

积分
259
发表于 2024-2-16 23:28:36 | 显示全部楼层 |阅读模式
收发缓冲区都是2048字节,测试时,上位机向设备发送2048字节数据,设备收到后,向上位机发送2048字节数据。

现在的现象是,设备收到2048字节后,设备也进入了发送流程,但上们机没收到,得上位机向设备发送了4096字节后,才能从设备收到4096字节数据。

[C] 纯文本查看 复制代码
	while (1)
	{
			if (tx_event_flags_get(&CDC_EventFlag, RX_NEW_RECEIVED_DATA, TX_OR_CLEAR,
														 &transmitdataflag, TX_WAIT_FOREVER) == TX_SUCCESS)		
			{
				if (tx_event_flags_set(&CDC_EventFlag, TX_NEW_TRANSMITTED_DATA, TX_OR) != TX_SUCCESS)
				{
					Error_Handler();
				}				
			}
			tx_thread_sleep(MS_TO_TICK(10));
		
	}

回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2024-2-16 23:31:38 | 显示全部楼层
收发改成1024,也是上位机发送够4096字节后,上位机一次性收到4096
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-2-17 09:20:49 | 显示全部楼层
ccschen 发表于 2024-2-16 23:31
收发改成1024,也是上位机发送够4096字节后,上位机一次性收到4096

这么来看应该是配置选项那里设置了。

另外看下USBX里面有没有类似data available的函数
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2024-2-17 19:43:16 | 显示全部楼层
eric2013 发表于 2024-2-17 09:20
这么来看应该是配置选项那里设置了。

另外看下USBX里面有没有类似data available的函数

[C] 纯文本查看 复制代码
UINT _ux_device_class_cdc_acm_write(UX_SLAVE_CLASS_CDC_ACM *cdc_acm, UCHAR *buffer, 
                                ULONG requested_length, ULONG *actual_length)


这个函数都返回了成功。。。现在收发都是同一个端点,不知道有不有影响。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2024-2-17 21:10:59 | 显示全部楼层
UX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP 使能就对了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-2-18 00:46:28 | 显示全部楼层
ccschen 发表于 2024-2-17 21:10
UX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP 使能就对了。

谢谢告知最终原因。
回复

使用道具 举报

11

主题

41

回帖

74

积分

初级会员

leduo

积分
74
发表于 2024-4-15 20:47:42 | 显示全部楼层
楼主可以参考下这个例程吗,最近在学习usbx
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-4-16 08:36:21 | 显示全部楼层
Aesthetics 发表于 2024-4-15 20:47
楼主可以参考下这个例程吗,最近在学习usbx

CDC虚拟串口例子就可以。在AZURE H7的软件包里面有。
回复

使用道具 举报

8

主题

19

回帖

43

积分

新手上路

积分
43
发表于 2024-7-11 22:17:51 | 显示全部楼层
eric2013 发表于 2024-4-16 08:36
CDC虚拟串口例子就可以。在AZURE H7的软件包里面有。

这个软件包在哪里找呀汉哥
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2024-7-12 09:26:45 | 显示全部楼层
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-13 23:29:12 | 显示全部楼层
本帖最后由 h_007 于 2024-7-13 23:31 编辑

USB CDC fullspeed,数据包大小如果是64的整数倍,要额外添加最后一个包是空包(zero length package)
比如要发送64byte,分包数为:1+1(0字节包)=2
发送和接收同样处理
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-13 23:31:46 | 显示全部楼层
63byte,分包数为:1
65byte,分包数为:1+1=2
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-13 23:51:34 | 显示全部楼层
MCU端一般是device,PC端是host,IN和OUT都是相对host定义的。
device端点IN的callback是发送,端点OUT的callback是接收
简化的处理:在usb_sil文件里调用读或者写函数,这时注意空包的处理方式。结束时注意清理收到的总的数据(接收callback),否则下一次传输(每1ms主机轮询一次)会覆盖数据。
sil_read,sil_write可根据需要修改
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-14 00:13:49 | 显示全部楼层
举例:
1. device发送64byte数据(sil_write)后,没有发送空包(host会一直等待,认为本次传输没有结束)
2. device再发送另一个64byte数据(sil_write),host收到后,认为本次传输结束
3. host认为数据接收错误(多接收了数据)
注意,
1. usb的硬件缓存一般是每个端点64byte,每次传输>=64byte,就需要分包,一般是修改sil_read和sil_write(每个厂家的sil_read和sil_write都不太一样,在usb_sil.c里面找)。
2. 避免直接操作usb硬件缓存(usb_mem.c里面找,这个一般不需要修改)。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 18:50 , Processed in 0.336997 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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