Esp32 C3 Arduino 串口开发(2)

主要使用了SerialEvent事件进行测试。测试中发现,这个事件实际上是伪事件,serial0和串口1的事件调用在loop内。而且,serila0 在前面优先,明显感觉,serial0  阻塞影响 serial1的Event,下面为代码,可以直接使用。

#define BTN_STOP_ALARM    0
#define     LED_D4     12
#define     LED_D5     13

#define     TXD1     0
#define     RXD1     1


#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);
  Serial1.begin(115200,SERIAL_8N1,RXD1,TXD1);
  
  pinMode(LED_D4, OUTPUT);   
  pinMode(LED_D5, OUTPUT);  //

  digitalWrite(LED_D4, LOW);
  digitalWrite(LED_D5, LOW);  

}
 
void loop() {
//  ToggleOutBlink(LED_D5,1000);
}


/*
 SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
/* 
 void serialEvent()  //串口 0
 void serialEvent1() //串口 1
 void serialEvent2() //串口 2
 void serialEvent3() //串口 3
 */

String comdata = "";//声明字符串变量
String comdata1 = "";//声明字符串变量

void serialEvent(){//串口 0
  //Serial.println("Got Data on UART...");
  while(1){
    if(Serial.available()) // if there is data on the line
    {
      //SerialErrCount=0;
      comdata += char(Serial.read());// read string until we see a newline character
      comdata.toUpperCase();
      if(comdata == "ON")
      {
        comdata ="";
        digitalWrite(LED_D4, HIGH);
        Serial.println("I turned it ON!"); // Reply text to send to Serial Monitor
      }
      else
      if(comdata == "OFF")
      {
        comdata ="";
        digitalWrite(LED_D4, LOW);
        Serial.println("I turned it OFF"); // Reply text to send to Serial Monitor
      }
      else {
        vTaskDelay(1 / portTICK_PERIOD_MS); 
        if(comdata.length()>=34){
          Serial.println(comdata+"\n"); // Reply text to send to Serial Monitor
          //Serial.flush();  //等待串口发送完毕???        
          comdata ="";
          while(Serial.read()>= 0){}//clear serialport
          ToggleOutput(LED_D4);
        }
      }
    }else break; // 收到事件后处理完毕自动跳出循环  测试 OK!
      //vTaskDelay(1); //必须放一个以便响应其它人物的消息循环,否则将死锁。 
  } 
}

void serialEvent1(){//串口 1
  //Serial1.println("Got Data on UART...");
  while(1){
    if(Serial1.available()) // if there is data on the line 是非阻塞的
    {
      //Serial1ErrCount=0;
      comdata1 += char(Serial1.read()); // read string until we see a newline character
      comdata1.toUpperCase();
      if(comdata1 == "ON")
      {
        //comdata1 ="";
        digitalWrite(LED_D4, HIGH);
        Serial1.println("I turned it ON!"); // Reply text to send to Serial Monitor
      }
      else
      if(comdata1 == "OFF")
      {
        //comdata1 ="";
        digitalWrite(LED_D4, LOW);
        Serial1.println("I turned it OFF"); // Reply text to send to Serial Monitor
      }
      else {
        vTaskDelay(1 / portTICK_PERIOD_MS); 
        if(comdata1.length()>=24){
          Serial1.println(comdata1+"\n"); // Reply text to send to Serial Monitor
          //Serial1.flush();//等待串口发送完毕???
          comdata1 ="";
          while(Serial1.read()>= 0){}//clear serialport
          ToggleOutput(LED_D5);
        }
      }
    }else break; //收到事件后处理完毕自动跳出循环  测试 OK!
      //vTaskDelay(1); //必须放一个以便响应其它人物的消息循环,否则将死锁。
  }  
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32-C3是一款基于Espressif ESP32-C3芯片的微控制器板,它集成了Wi-Fi和蓝牙功能,并且支持Arduino开发框架,使得物联网(IoT)项目变得更加简单。在ESP32-C3上,串口通信是一种常见的数据传输方式,用于设备间的数据交互。 串口中断是处理串行通信的一种高效机制,当串口接收到来自外部设备的数据或者达到预设条件(如特定字符、字节计数等)时,会触发中断。在ArduinoESP32-C3环境中,你可以通过以下几个步骤配置串口中断: 1. **初始化串口**:首先,你需要初始化Serial.begin()函数,设置串口的波特率和模式。 2. **设置中断服务函数(ISR)**:通过`attachInterrupt()`函数,可以为串口接收缓冲区满或者指定中断标志设置中断服务程序。例如,可以监听RX_PIN(接收到数据的引脚)的中断事件。 ```cpp void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(RX_PIN), handleSerialInterrupt, RISING); // RISING表示接收到数据时触发 } void loop() { // 主程序运行 } void handleSerialInterrupt() { // 当串口接收缓冲区满时执行的回调函数 Serial.read(); // 读取并处理接收到的数据 } ``` 3. **处理中断**:在中断服务函数中,你需要编写处理串口数据的代码,然后清除中断标志以便再次触发。 4. **处理异常情况**:记得在适当的地方检查中断标志状态以及串口的状态,避免因错误操作导致死循环或其他问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值