使用上次的工具来测试 Ch55x(Ch551/2/4)开发板的串口速度。
实际测试的是 CH554 ,使用 Ch55xduino 编写代码如下:
#ifndef USER_USB_RAM
#error "This example needs to be compiled with a USER USB setting"
#endif
#include "src/userUsbCdc/USBCDC.h"
//This is a fairly large array, store it in external memory with keyword __xdata
__xdata char recvStr[64];
// 代码中出现的发送和接收
// 测试 Package 的大小
#define MAX_N 256
// 2秒超时
#define TIMEOUT 2000
// 接收数据 Buffer
// 设置为实际的2倍大小避免接收超过Buffer 的问题
__xdata byte receiveBuffer[MAX_N];
void setup() {
USBInit();
}
// 状态机记录
byte currentStatus = 0;
// 收到的数量
int counter = 0;
// 超时计时器
unsigned long Elsp;
// 发送标记,True 时发送,反之不发送
boolean sendOnce = true;
// 发生错误的数量
int failCount;
void loop() {
switch (currentStatus) {
case 0:
// 初始状态
while (USBSerial_available()) {
byte c = USBSerial_read();
// q命令查询当前状态(用于调试)
if (c == 'q') {
USBSerial_print_s("Current 0");
USBSerial_flush();
}
// 1(接收模式) 2(发送模式)
if ((c == '1') || (c == '2')) {
// 转移到下一个状态
currentStatus = c - '0';
// 如果是接收模式,那么开始计时
if (c == '1') {
Elsp = millis();
counter = 0;
}
}
}
break;
case 1: //接收模式
// 如果接收模式超时,那么直接返回到状态0
if (millis() - Elsp > TIMEOUT) {
// 返回状态 0
currentStatus = 0;
// 发送 "aaa" 表示当前超时
USBSerial_write('a'); USBSerial_write('a'); USBSerial_write('a');
USBSerial_flush();
}
// 接收数据
while (USBSerial_available()) {
byte c = USBSerial_read();
receiveBuffer[counter] = c;
// 统计接收到的数据量
counter++;
// 如果接收到足够的数据,那么转移到状态3 进行校验
if (counter == MAX_N) {
currentStatus = 3;
//Serial.print("St3");
}
}
break;
case 3:
// 校验接收模式收到的数据,数据是 0x55 0xaa 0x55....
failCount = 0;
for (int i = 0; i < MAX_N; i = i + 2) {
if (receiveBuffer[i] != 0x55) {
failCount++;
}
if (receiveBuffer[i + 1] != 0xAA) {
failCount++;
}
}
// 检查是否有错误
if (failCount == 0) {
// 返回"ppp" 表示校验通过
USBSerial_write('p'); USBSerial_write('p'); USBSerial_write('p');
USBSerial_flush();
}
else {
// 校验失败,返回 'f'+发生错误的数量错误数据
USBSerial_write('f');
USBSerial_write((byte)(failCount & 0xFF));
USBSerial_write((byte)(failCount >> 8));
}
counter = 0;
//Serial.println("Switch to status 1");
Elsp = millis();
currentStatus = 1;
break;
case 2:
// 发送模式,直接发送 MAX_N 个 0x55 0xaa 0x55 ....
if (sendOnce) {
for (int i = 0; i < MAX_N / 2; i++) {
USBSerial_write(0x55);
USBSerial_write(0xAA);
USBSerial_flush();
}
sendOnce = false;
}
while (USBSerial_available()) {
char c = USBSerial_read();
if (c == '0') {
currentStatus = 0;
//Serial.print("Switch to 0");
}
if (c == '2') {
sendOnce = true;
}
// 查询状态
if (c == 'q') {
USBSerial_print_s("Current 2");
USBSerial_flush();
}
}
break;
default: {
USBSerial_println_s("Unknown status");
USBSerial_flush();
}
}
1.PC端接收,Ch554发送,可以看到速度能达到37K/S左右
2.PC端发送,Ch554接收,可以看到速度能达到97K/S左右
从结果可以看出来,比 32U4 这样的芯片还是快一点点的(测试模式是 5V 24Mhz)
可以提供测速的软体吗
查了一下,代码找不到了,主要是最近坏了一个硬盘。