初学ESP32
所用硬件 OLED屏幕 ESP32一块 USB转TTL一块
背景是上位机传送数据到ESP32上,收到数据后在根据数据进行相应倒数
整体思路为:初始化单片机后进入循环,循环分为两个状态,一个为接收数据状态,一个为具体倒数状态,通过switch和state_1,state_2来控制。虽然现在想来这个switch没什么必要。。。。 将就看吧。

单片机全部代码
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SERIAL_RX_BUFFER_SIZE 512
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
char recData=0;
char Head1 = 'A',Head2 = 'B',End = 'C';
char RxBuffer2[10];
int Rxcounter2=0;
int rxstate1 = 0;
char Rx1 ,Rx2, Rx3, Rx4,Rx5;
int Rt=0,Gt=0,Em=0;
int state_1=0,state_2=0;
int R_flag = 0;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(1000);
}
void loop() {
switch(state_1)
{
case 0: state_2=0;
break;
case 1: state_2=1;
break;
}
if (state_2 == 0)
{
Serial.begin(9600);
delay(500);
while(R_flag == 0){
Serial.println("Loop1");
recData = Serial.read();
if(rxstate1 == 0 && recData == 'A')
{
rxstate1 = 1;
RxBuffer2[Rxcounter2++] = recData;
}
else if(rxstate1 == 1 && recData == 'B')
{
rxstate1 = 2;
RxBuffer2[Rxcounter2++] = recData;
}
else if (rxstate1 == 2)
{
RxBuffer2[Rxcounter2++] = recData;
if(recData == 'C')
{
rxstate1= 3;
}
}
else
{
rxstate1 = 0;
Rxcounter2 = 0;
}
if (rxstate1 == 3)
{
if(RxBuffer2[Rxcounter2-1]=='C')
{
Rx1 = RxBuffer2[2];
Rx2 = RxBuffer2[3];
Rx3 = RxBuffer2[4];
Rx4 = RxBuffer2[5];
Rx5 = RxBuffer2[6];
Rt = (int(Rx1)-48)*10 + (int(Rx2)-48);
Gt = (int(Rx3)-48)*10 + (int(Rx4)-48);
Em = (int(Rx5)-48);
R_flag = 1;
rxstate1 = 0;
Rxcounter2 = 0;
while(Serial.read() >= 0){}
Serial.end();
}
else
{
rxstate1 = 0;
Rxcounter2 = 0;
}
}
}
state_1 = 1;
}
if (state_2 == 1)
{
while(Rt!=0)
{
Serial.println("Loop2");
Rt--;
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print(Rt);
display.display();
delay(1000);
}
state_1 = 0;
R_flag = 0;
}
}