Esp32 C3 Arduino 串口开发(1)

发布时间:2023-04-27 09:30

网上合宙的esp32 C3 的测试版 9.9元,简洁小巧,用于学习测试非常方便。原来是装的Luatos,可以直接用Arduino开发。Arduino安装的为最新版 V2.00RC8,有点类似 vScode的风格,支持代码提示 、补全等功能 。

Esp32 C3 Arduino 串口开发(1)_第1张图片

下载安装网址:Software | Arduino

Esp32 C3 Arduino 串口开发(1)_第2张图片

支持中文模式:

Esp32 C3 Arduino 串口开发(1)_第3张图片

安装完Arduino 后,需要安装Esp32 Arduino 支持包,最新版为 2.03,安装比较慢,要有耐心,也可以进入网站直接下载然后离线安装.zip文件。

Esp32 C3 Arduino 串口开发(1)_第4张图片

 我是在线安装的,还是比较快的。

离线包的下载地址:Esp32 C3 Arduino 串口开发(1)_第5张图片

经测试,我发现,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 = "";
    }
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号