IsSame=TRUE;
for ( i = 0; i < len; i ++ ){
if (LastBuffer[i]!=RxBuffer[i]) {
IsSame=FALSE;
LastBuffer[i]=RxBuffer[i];
}
}
//只有与前一次不同才进行输出
if (IsSame==FALSE) {
checksum=0x00;
CH554UART1SendByte(0x57);CH554UART1SendByte(0xAB);CH554UART1SendByte(0x88);CH554UART1SendByte(len+3);CH554UART1SendByte(0x10);
for ( i = 0; i < len; i ++ ){
CH554UART1SendByte(RxBuffer[i]);
checksum=checksum+RxBuffer[i];
}
checksum=checksum+counter;
CH554UART1SendByte(counter); CH554UART1SendByte(checksum);
counter++;
}
代码使用 Keil4 编译通过。
ESP32-C3代码如下:
#include <Arduino.h>
#include <BleKeyboard.h>
BleKeyboard bleKeyboard;
#define DEBUGMODE 0
void setup() {
Serial.begin(115200);
Serial1.begin(115200, SERIAL_8N1, RX, TX);
bleKeyboard.begin();
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '1') {
Serial.println("get1");
}
if (c == '3') {
ESP.restart();
}
}
//根据 CH9350 Spec 每次最多输出 72Bytes
byte Data[72];
unsigned int CounterLast = Serial1.available();
unsigned int CounterCurrent = 0;
// 如果当前串口有数据
if (CounterLast != 0) {
// 进行简单测试,如果当前还在传输数据那么持续接收
while (CounterCurrent != CounterLast) {
CounterLast = Serial1.available();
delayMicroseconds(500);
CounterCurrent = Serial1.available();
}
}
if (CounterCurrent > 0) {
// 一次性将数据收取下来
Serial1.readBytes(Data, CounterCurrent);
unsigned int i = 0;
unsigned int Length;
while (i < CounterCurrent) {
// 识别帧头
if ((Data[i] == 0x57) && (Data[i + 1] == 0xAB)) {
// 有效键值帧
if (Data[i + 2] == 0x88) {
// 获得数据长度
Length = Data[i + 3];
if (DEBUGMODE) {
//Serial.print("Ln:");Serial.print(Length);
for (int j = 1; j < Length + 1; j++) {
if (Data[i + 3 + j] < 16) {
Serial.print("0");
}
Serial.print(Data[i + 3 + j], HEX);
Serial.print(" ");
}
Serial.println(" ");
}
//如果是键盘
if (Data[i + 4] == 0x10) {
if (DEBUGMODE) {
Serial.print("Key");
for (int j = 1; j < Length + 1; j++) {
Serial.print(Data[i + 3 + j], HEX);
Serial.print(" ");
}
Serial.println(" ");
}
//判断为Dostyle键盘
if (Data[i + 3 + 1] == 0x10) {
if (bleKeyboard.isConnected() == true) {
bleKeyboard.sendReport((KeyReport*)(&Data[i + 3 + 2]));
}
}
}
i = i + 3 + Length;
} else if (Data[i + 2] == 0x82) {
i = i + 3; // 跳过
}
}
i++;
} // while (i < Counter)
}
}