WCH沁恒单片机
直播中

李梅

7年用户 1274经验值
私信 关注
[问答]

用CH340B制作一个UEFI Shell助手工具,串口无法达到需要的波特率是为什么?

最近我在用 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 芯片:



测试可以看到每次发送都会有多接收漏数据和出错的情况,如果我将波特率降低为 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 在顶部,也有同样的现象

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


  

回帖(8)

王华梅

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

汤宇

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


谢谢!


举报

王娟

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


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



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

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



举报

袁丹

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

更多回帖

发帖
×
20
完善资料,
赚取积分