[求助]串口调试软件的上限速度

使用《模块调试(串口测试).EXE》运行CH340非常好。因为只需要接收信息,在固定选择的最高波特率(921600)下运行得很不错,相信应该可以作到最高的2M速度。期望提供改进的版本,更期望提供实用的子模块可以镶嵌到自己的程序中使用……

******************************************************************************* 关于支持非标准波特率或者更高通讯波特率

对于一些非标准波特率或者常规方法无法设置的高速波持率,CH341驱动程序提供特殊方法, 应用程序可以按串口写数据的方式间接设置CH341的串口通讯波特率,方法是: 设置CH341串口波特率为300,然后以ASCII码字符串的命令包写串口, 命令包的首字节必须是#,井字符,对应的十六进制数为23H, 命令包的中间为不超过7个数字表示的波特率,例如字符串9600或者921600等, 命令包的尾字节必须是_,下划线,对应的十六进制数为5FH, 也就是说,将要设置的波特率以字符串的形式置于#字符和_字符之间,作为一个命令包, 在300bps下发送到CH341的串口,那么将被CH341驱动程序解释为修改CH341的波特率, 而不会被作为数据从串口真正发出,当该操作成功返回后, CH341实际工作于指定的新波特率,当然,计算机系统及串口控件仍然以为是工作于300bps, 如果需要再次以这种方法改变波特率,那么首先要用常规方法将CH341的波特率置为300bps。

例如,用串口监控/调试工具软件演示: 1、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为6个ASCII码数据: #9600_ 发送成功后,CH341将实际工作于9600bps 2、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为8个ASCII码数据: #460800_ 发送成功后,CH341将实际工作于460800bps 3、将CH341串口的波特率选择为300bps(有些工具软件在选择波特率后必须重新打开串口), 发出字符串命令包,为9个ASCII码数据: #1000000_ 发送成功后,CH341将实际工作于1000000bps

CH341串口支持50bps到2Mbps的波特率,当应用程序请求CH341改变串口通讯波特率时, CH341驱动程序将波特率换算为波特率除数,然后修改CH341芯片内部的波特率除数寄存器, 所以设置CH341串口的通讯波特率实际上是设置CH341芯片内部的波特率除数寄存器, 由于CH341内部的串口基准位时钟为48/8=6MHz(或12MHz),并且波特率除数只支持整数, 所以在指定波特率时,应该考虑实际换算误差,在波特率大于19200bps时的计算方法是: X = 6000000 除以波特率后的值 Y = X 四舍五入后的值 误差 = ( Y - X ) / X

以下为CH341支持的常用波特率,未注明的基准位时钟为6MHz,未注明的误差小于0.16% 921600 (12MHz), 460800, 307200 (12MHz), 230400, 153600, 128000 (0.27%), 115200, 76800, 57600, 56000, 38400, 33600, 28800, 19200, 14400, 9600, 7200, 4800, 3600, 2400, 1800, 1200, 900, 600, 300, 150, 134.5, 110, 100, 75, 50, 2000000, 1500000, 1200000, 1000000, 750000, 500000, 375000, 250000, 200000, 187500, 100000, 93750, 75000, 50000, 25000, 10000 其它波特率只要误差小于2.5%,CH341都可以支持,计算误差时要考虑两端的误差之和。 但是为了可靠进行通讯,建议不要使用误差大于1%的波特率。


首先,非常感谢耐心地解答!

  对这段解答的主体有似曾相识的感觉,忘记是在哪位朋友同类提问的回复中看到过的,不过感觉这次的回复更具体,能够基本解决实际的问题了。不过对其中“如果需要再次以这种方法改变波特率,那么首先要用常规方法将CH341的波特率置为300bps。”有点疑问,是否可以把其中“常规方法”理解为以上次已经修改到的新波特率(例如9600)来发送“#300_”?

  在公司提供的调试工具软件中,这样的做法好象无须过问细节,只要选择了去做就是,但如果是在自己组织的软件中,如何理解这“字符串命令包”还有些疑问。因为在自己组织的软件中,需要传递的信息已经直接就是或者转化为16进制字符了,当然不会是在300这样小的速率下进行的,但是否一定要注意避免产生类似“#300_”或者其他可能组合的巧合发生?


  其实,我目前开发的产品实际应用中的需求比这问题要简单得多:对CH340而言硬件结构就是一固定通讯频率的单片机串口,需要解决的问题是在配套的应用软件中直接搜索到串口的位置,并按要求设置配合的波特率,期望的是得到一个完整的API过程供软件进入之前直接后台调用。

  虽然要求很简单,却恰好包含了三种不同的波特率提供不同产品的需求,其中一种是为得到最高速率数据采集而需要的2M、再就是兼顾速度和稳定性需求的1.5M,最后是为节约成本及安装位置与USB接口公用12M晶振而需要的750000,最后这个速度虽然为非常规,事实上却恰好符合零误差的标准。另外,为最后这种需要,还想知道在实际运用中是从CH340的X0输出频率给单片机,还是晶振接单片机产生震荡后输入接口的XI更为合理?


1-如果要支持非标准波特率必须在300bps下发送指定的字符串配置到指定的bps 2-在其他bps下发送指定的字符串是不会影响了 3-你的应用ch340完全可以实现


  不好意思,因为是直接用公司的《模块调试(串口测试).EXE》来进行的,所以在300bps下发送指定的字符串之后,其实根本就只能工作在工具所选定的那些波特率下进行,而非自己选择的数值……


是可以工作在非标准的波特率下的,我们做过测试!


呵呵,不好意思,是我没弄懂您的意思。利用这个演示工具,刚刚重新实验的结果是:在发出#921600_之后在不改变300的波特率下继续操作,就可以按新的波特率来接收数据了,我原来的实验是在发出修改命令之后立即改变为921600就可以基本正常,而因为变为1500000之后,超出工具限定的范围而失败。

现在简单实验的效果是肯定了的,就不知道实际运行中这样会不会影响到真实的速度……


呵呵,真的很不错呀!

我刚刚重新换过晶振做1.5M速率的实验,效果非常令人满意。今天的临时用途真的是很应急了,不过从长远利益的最终产品,还是希望尽快满足我另外一帖子〈[求助]CH340串口命令的API指令〉的需求。


其实,我自己的问题已经基本解决了,但既然上来了还是想罗嗦几句:

  直接使用公司提供的“模块调试”工具来做实验,固然因为条件的限制只好使用这种折中的办法来解决;但实用中却完全不必多此一举!我在编程的实践中先是按此方法来实现的,后来感觉不是很方便,就试探着直接使用VB提供的控件设置通讯速率(实用24M晶振分别在1.5M和750000的波特率进行通讯实验,均得到满意的效果。

  说得直白一点,就是公司提供的驱动程序中已经包含了这些底层的操作,用户只要按正常操作串口同样的办法处理即可。


只有登录才能回复,可以选择微信账号登录