发布时间:2023-04-27 09:30
网上合宙的esp32 C3 的测试版 9.9元,简洁小巧,用于学习测试非常方便。原来是装的Luatos,可以直接用Arduino开发。Arduino安装的为最新版 V2.00RC8,有点类似 vScode的风格,支持代码提示 、补全等功能 。
下载安装网址:Software | Arduino
支持中文模式:
安装完Arduino 后,需要安装Esp32 Arduino 支持包,最新版为 2.03,安装比较慢,要有耐心,也可以进入网站直接下载然后离线安装.zip文件。
我是在线安装的,还是比较快的。
经测试,我发现,2.03(基于IDF SDKV4.4.1)版本的EEprom 库部分有问题,对于ESP32 c3 无法进行存储,提交问题后,得到快速答复,说是DIO/QIO模式的问题,已经在 2.04版本进行更改了。等待2.04版及时发布。但是这并不影响其它功能。下面开始了学习测试之旅。由于通讯测试比较容易,不需要其它元器件,仅需要一个TTL的串口接头。我用的是CP340的接口。当然如果仅c测试串口 0,则不需要此接口。开发板上安装了CH343 串口芯片,因此需要先安装CH343的驱动。 网内下载即可:CH343EVT.ZIP - 南京沁恒微电子股份有限公司CH343评估板设计原理图,用于USB转串口。https://www.wch.cn/downloads/CH343EVT_ZIP.html
串口工作模式 (一)。
以下为代码,在Loop内循环调用等待。供参考。首先定义常量如下:
串口 0 默认为 IO20和IO21,本测试无需引线,板内部已经和CP343连接,可以直接测试。
#define BTN_STOP_ALARM 0
#define LED_D4 12 开发板的 LED1
#define LED_D5 13 开发板的 LED2
#define TXD1 0 串口 1使用的TX PIN
#define RXD1 1 串口 1使用的RX PIN
String comdata = "";//声明字符串变量
void setup()
{
Serial.begin(9600); //设定的波特率
}
void loop()
{
while (Serial.available() > 0)
{
comdata += char(Serial.read());//readBytes
delay(2);
}
if (comdata.length() > 0)
{
Serial.println(comdata);
comdata = "";
}
}
注意:Serial对应内部串口 0,Serial1对应内部串口 1,以上为典型开发历程,只对串口0操作,下面为对两个串口0在loop内的操作代码。
/*
Serial Receive Comand example
收到 ON/n 则点亮 LED-D4
收到 OFF/n 则关闭 LED-D5
This example shows how to use hardware timer in ESP32. The timer calls onTimer
function every second. The timer can be stopped with button attached to PIN 0
(IO0).
This example code is in the public domain.
*/
#define BTN_STOP_ALARM 0
#define LED_D4 12
#define LED_D5 13
#define ToggleOutput(out) do { digitalWrite(out, !digitalRead(out)); } while(0)
#define ToggleOutBlink(out,interval) do {static uint32_t estp=0;if( (millis()-estp)>=interval ){ estp=millis();digitalWrite(out, !digitalRead(out));} } while(0)
void setup() {
Serial.begin(9600);
pinMode(LED_D4, OUTPUT);
pinMode(LED_D5, OUTPUT); //
digitalWrite(LED_D4, LOW);
digitalWrite(LED_D5, LOW);
}
void loop() {
ToggleOutBlink(LED_D5,1000);
if(Serial.available()) // if there is data on the line
{
String mycommand = Serial.readStringUntil('\n'); // read string until we see a newline character
mycommand.toUpperCase();
if(mycommand == "ON")
{
digitalWrite(LED_D4, HIGH);
Serial.println("I turned it ON!"); // Reply text to send to Serial Monitor
}
else
if(mycommand == "OFF")
{
digitalWrite(LED_D4, LOW);
Serial.println("I turned it OFF"); // Reply text to send to Serial Monitor
}
else {
Serial.println(mycommand); // Reply text to send to Serial Monitor
}
}
}
下面代码为打开了串口 1 进行配置。并对串口0和1 进行了缓冲区再分配!esp32串口默认缓冲区为128 字节,更改为 512字节。并演示了清空串口缓冲区的方法。注意,Serial.flush不再是清空缓冲区功能了,最新文档显示:为串口传送缓冲发送完毕的标记!
#define BTN_STOP_ALARM 0
#define LED_D4 12 开发板的 LED1
#define LED_D5 13 开发板的 LED2
#define TXD1 0 串口 1使用的TX PIN
#define RXD1 1 串口 1使用的RX PIN
#define MaxUartErrorCount 20
#define MaxUartRxBufferSize 512
#define Uart0BaudRate 9600
#define Uart1BaudRate 115200
String comdata = "";//声明字符串变量
void setup()
{
Serial.begin(Uart0BaudRate);
Serial1.begin(Uart1BaudRate,SERIAL_8N1,RXD1,TXD1);
Serial.setRxBufferSize(MaxUartRxBufferSize);//默认缓冲区位128 Byte,更改为 512 Byte
Serial1.setRxBufferSize(MaxUartRxBufferSize);//默认缓冲区位128 Byte,更改为 512 Byte
while(Serial0.read()>= 0){}//clear serialport
while(Serial1.read()>= 0){}//clear serialport
}
void loop()
{
while (Serial.available() > 0)
{
comdata += char(Serial.read());//readBytes
delay(2);
}
if (comdata.length() > 0)
{
Serial.println(comdata);
comdata = "";
}
}