找回密码
 立即注册
查看: 1165|回复: 22

CDC范例中,怎样实现波特率自适应的?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-12 10:33:07 | 显示全部楼层 |阅读模式

如题,在 STC8H8K64U-DEMO-CODE-V9.6-20231025\61-CDC(Communication Device Class)协议范例中,哪个地方实现了波特率自适应的?

我看设置波特率的,好像是这个函数,但又不能理解它的具体意思,请大家指教,谢谢!

void usb_uart_settings()
{
    if (Setup.bRequest == SET_LINE_CODING)
    {
        LineCoding.bCharFormat = 0;
        LineCoding.bDataBits = 8;
      
        uart_set_parity(LineCoding.bParityType);
        uart_set_baud(reverse4(LineCoding.dwDTERate));
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-12 10:35:09 | 显示全部楼层
CDC是可以忽略波特率的,USB直接传输,只有需要转UART时才需要波特率
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-12 10:59:48 | 显示全部楼层
Debu*** 发表于 2024-12-12 10:35
CDC是可以忽略波特率的,USB直接传输,只有需要转UART时才需要波特率

串口数据输出输入,一定需要适配的波特率

点评

设置波特率是通过set_line_coding实现的,波特率等信息会写入LineCoding结构体,然后调用uart_set_baud函数设置UART波特率 [attachimg]72016[/attachimg] [attachimg]72020[/attachimg]  详情 回复 发表于 2024-12-12 11:55
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-12 11:08:16 | 显示全部楼层

也就是说,上位机选择115200时,单片机的串口就会设置好115200的波特率收发数据。上位机选择9600,单片机的串口就会设置好9600的波特率收发数据。这是怎么识别的?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-12 11:26:59 | 显示全部楼层
xxkj*** 发表于 2024-12-12 11:08
也就是说,上位机选择115200时,单片机的串口就会设置好115200的波特率收发数据。上位机选择9600,单片机的 ...

肯定会有个请求指令的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-12 11:34:48 | 显示全部楼层
xxkj*** 发表于 2024-12-12 11:08
也就是说,上位机选择115200时,单片机的串口就会设置好115200的波特率收发数据。上位机选择9600,单片机的 ...

USB-CDC的整个通讯链路都是USB Full-speed协议,没有出现过UART通讯,没有出现过真正的串口,没有用到串口外设,因此这里设置的波特率仅仅是个代号,没有任何实际意义的

也就不存在“自适应”波特率的这种说法。


当然,单片机确实知道你设置的波特率是多少,这是以整数形式传输过去的USB-CDC配置信息。不过它完全不care。这并不影响通讯。



换个角度来说。

”波特率“对于传统串口的使用来说,它是一种重要参数

而对于USB-CDC串口的使用来说,”波特率“只是一种附加的信息

你甚至可以做到,不通过USB-CDC发送任何字节,仅仅通过反复改变波特率设定,就完成某些信息的传输。
例如通过编写一些有趣的程序,可以做到:

电脑设定波特率为100,风扇以100转速工作;

电脑设定波特率为200,风扇以200转速工作;
电脑设定波特率为1200,风扇以1200转速工作;
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-12 11:39:48 | 显示全部楼层
VC*** 发表于 2024-12-12 11:34
USB-CDC的整个通讯链路都是USB Full-speed协议,没有出现过UART通讯,没有出现过真正的串口,没有用到串口 ...

难怪在串口初始化函数void uart_init()中,只看到
  1.     LineCoding.dwDTERate = 0x00c20100;  //115200
复制代码
这只是初始化的波特率。而通讯过程中,没有再出现设置dwDTERate或串口波特率。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-12 11:42:16 | 显示全部楼层
xxkj*** 发表于 2024-12-12 11:39
难怪在串口初始化函数void uart_init()中,只看到这只是初始化的波特率。而通讯过程中,没有再出现设置dw ...

USB-CDC转双串口一定会用到波特率数据。USB-CDC和单片机内部通讯,完全不需要用到波特率数据
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-12-12 11:48:36 | 显示全部楼层
VC*** 发表于 2024-12-12 11:42
USB-CDC转双串口一定会用到波特率数据。USB-CDC和单片机内部通讯,完全不需要用到波特率数据 ...

也就是说,单片机的USB端收到什么数据,它就会以上位机设置的波特率通过串口转发出去?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-12 11:55:15 | 显示全部楼层
xxkj*** 发表于 2024-12-12 10:59
串口数据输出输入,一定需要适配的波特率

设置波特率是通过set_line_coding实现的,波特率等信息会写入LineCoding结构体,然后调用uart_set_baud函数设置UART波特率
截图202412121150264296.jpg

截图202412121155119809.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:40 , Processed in 0.158619 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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