最近我在用 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 文件,其中65535个0,1个为1因此checksum 输出应该为1。下面是我遇到的问题:
这是我制作的设备,我使用 CH340B 芯片:
测试可以看到每次发送都会有多接收漏数据和出错的情况,如果我将波特率降低为 115200 那么是完成正常的。
下面是我的电路图
CH340B 在背面, RX/TX 有一个过孔连接到 ESP32上:
作为对比,我进行如下实验
1.使用DFRobot 的 FireBeetle, 它用的是 CH340C 的芯片:
同样的代码,运行结果如下,可以看到没有问题。这个实验能够说明前面的测试代码没有问题。
2.使用nanoESP32 开发板,测试结果和前面类似,在1M波特率下工作一塌糊涂,这个使用的是 Ch340C 芯片
3. ESP32-S2-Saola-1 乐鑫科技 ESP32-S2 开发板,这是 ESP32 官方开发板使用的是 CP210X 的芯片,可以看到工作良好。
所以,我现在不清楚我遇到的问题是什么原因导致的。我觉得有如下可能性:
1. 假的 CH340B;
2. 布线问题. 我发现之前的也有同样的问题,例如:CH340B 在顶部,也有同样的现象
希望得到大佬的指点,以便解决这个问题。谢谢!