CH340B 搭配 ESP32 速度的问题

最近我在用 CH340B 制作一个 UEFI Shell 助手工具(开源硬件),但是在设计时发现串口无法达到需要的波特率。最高只有 115200*2 和我预期的 1Mhz 相差甚远。为了排除我代码问题,特别设计测试程序如下:

word checksum=0;
word counter=0;
unsigned long elsp=0;
 
void setup() {
  Serial.begin(1000000);
  delay(300);
}
 
void loop() {
  while (Serial.available()) {
      char c=Serial.read();
      checksum=checksum+c;
      counter++;
      elsp=millis();
    }
 
  if (((millis()-elsp>1000)&&(elsp!=0))) {
      Serial.print("Received ");Serial.println(counter);
      Serial.print("Checksum ");Serial.println(checksum,HEX);
      checksum=0;
      counter=0;
      elsp=0;
    }
}

这个代码是运行在 ESP32 上的 Arduino 代码,动作非常简单:不断从串口接收数据,如果1s以内没有数据就将收到数据的 checksum 和收到的数量打印出来。测试使用你们家的工具发送一个 64K 文件,其中6553501个为1因此checksum 输出应该为1。下面是我遇到的问题:


这是我制作的设备,我使用 CH340B 芯片:

1629117100290680.jpg


测试可以看到每次发送都会有多接收漏数据和出错的情况,如果我将波特率降低为 115200 那么是完成正常的。

1629117100187407.png


下面是我的电路图

1629117100173836.png

CH340B 在背面, RX/TX 有一个过孔连接到 ESP32上:

1629117100102110.png


作为对比,我进行如下实验


1.使用DFRobot FireBeetle, 它用的是 CH340C 的芯片:

1629117100438410.jpg


同样的代码,运行结果如下,可以看到没有问题。这个实验能够说明前面的测试代码没有问题。

1629117100938095.png


2.使用nanoESP32 开发板,测试结果和前面类似,在1M波特率下工作一塌糊涂,这个使用的是 Ch340C 芯片

1629117100123653.jpg


3. ESP32-S2-Saola-1 乐鑫科技 ESP32-S2 开发板,这是 ESP32 官方开发板使用的是 CP210X 的芯片,可以看到工作良好。

1629117100251628.png


所以,我现在不清楚我遇到的问题是什么原因导致的。我觉得有如下可能性:

1.      假的 CH340B;

2.      布线问题. 我发现之前的也有同样的问题,例如:CH340B 在顶部,也有同样的现象

1629117100198674.png

希望得到大佬的指点,以便解决这个问题。谢谢!


您好,确认串口信号线是否直连,若串联电阻或经过三极管等均会影响其速率,根据上面的pcb,串口信号受布线影响可能性很小。为方便排查问题,可以考虑在ESP32的接收引脚同时再并联接到另一个USB转串口芯片的接收引脚(用于监控),这样可以明确是否为发送本身问题。


二者之间是直接相连的,中间没有任何元件。晚上我会尝试并联一个USB转串口芯片进行实验。


谢谢!


image.png


进一步调试,忽然想起来我之前有打过单独的 CH340B 的板子,于是直接测试 Loop.


正面如下,这个板子足够小,因此应该也没有布线太长的问题:

1629197990151002.jpg


背后直接用跳线将TX 和 RX 接到一起:

1629197990421762.jpg

测试方法和之前的相同,可以看到有丢失数据的情况发生。比如:发送 30576 字节,但是接收到的只有 30557字节。再右侧能看到,中间有丢失逗号的情况发生。


ch340.png


您好,请问测试时右下角定时时间设置多少,还是发送区中一次发送30576字节?若为单次发送大数据,串口接收溢出的可能性较高。另,有时间可以做下如上的数据监控测试。或者也可以将您测试的设备寄给我做对比验证,排查问题点。


一次性发送 32K 数据,然后测试多次。


我使用逻辑分析仪查看了, 每隔 1024 字节会有4ms的间隔,我猜测你们内部缓冲是 1024字节的是吧?


然后我设置每次发送 1024字节,有相同的问题。这个能排除串口接收溢出了吧?


这几天我从立创商城购买了  CH340B 和  CH340C , 然后重新做了一个 PCB 再试试。


如果不好用还请帮忙。谢谢!


我重新在立创商城下的订单,购买的 CH340B 和 CH340C 的芯片,惊奇的发现他们表现差别很大,CH340C 明显好于 B。


例如,一次性发送 64K 的文件, 1M波特率,Ch340B 就会出现丢失数据的情况:

1629726421141240.png


但是 CH340C 不会

1629726421224640.png


二者使用相同的 PCB, Loopback 测试:


Ch340bC.jpg


请问他们在使用上,B的需要做特别设定吗?


您好,使用CH340B不需要特殊设定。看现象,CH340B应为串口数据溢出。另,串口发送数据是不会发生丢失的,只会出现在接收侧。如果要满足高波特率通讯,也可以考虑使用收发效率和支持速率更高的新一代USB转串口芯片:CH343。

http://special.wch.cn/zh_cn/produce/ 

另,关于一开始讨论的ESP32接收数据丢失/出错现象并非同一类问题。因USB转串口侧发送数据不会丢失,若接收不完整,怀疑是误差率的问题可能性较高。


您好,我前后说的是同一个问题。开始我在 ESP32 上使用你们家的 CH340B 发现有问题,


然后进一步分析发现 CH340 自身 loopback 都能看到同样的现象。前后说的是同一个事情的,


后者是前者分析的结果。


请问 CH340B 接收缓冲区有多大? 我可以修改ESP32 上程序代码来避免这个问题。


谢谢!


您好,可以先与我电话沟通相关测试情况,张工:18951773290


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