sonicfirr 发表于 2022-8-12 22:21

【Beetle ESP32-C3】五、开启两个UART(Arduino)

<div class='showpostmsg'><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测评项目继续回到Arduino IDE,本篇记录开启C3的第二个串口&mdash;&mdash;Arduino框架中的实例Serial1的过程。</p>

<h2><b>1、Arduino框架中的实例定义</b></h2>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arduino开发可以直接使用Serial,其实它是框架中已经定义好的HardwareSerial类型的对象。ESP32 Arduino Package的&ldquo;..\esp32\hardware\esp32\2.0.4\cores\esp32&rdquo;路径下有HardwareSerial.cpp和HardwareSerial.h,它们就是Arduino中串口的代码实现。HardwareSerial.cpp中有Serial和Serial1实例的定义,HardwareSerial.h中有两个对象变量的导出(extern),另外begin()函数的传参也很多,只不过除了第一个波特率,其它参数都有默认值。</p>

<p>&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图5-1&nbsp;Serial和Serial1定义</p>

<p align="center">&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图5-2&nbsp;HardwareSerial.begin()函数原型</p>

<p align="center">&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以,串口1使用Serial1即可以完成驱动应用。</p>

<h2><b>2、测试代码</b></h2>

<pre>
<code>#define LED 10   //IO10 for LED on board

bool flag = false; //LED status flag

void setup() {
// Initialize GPIO
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
// Initialize USB-UART
Serial.begin(115200);
// Initialize UART1
Serial1.begin(115200, SERIAL_8N1, /*rx =*/0, /*Tx =*/1);
}

int i = 0; //counter variable for Blink

void loop() {
if(Serial.available()) {
    char c = Serial.read();
    Serial1.print(c);
}
if(Serial1.available()) {
    char ch = Serial1.read();
    Serial.print(ch);
}
if(i++ &gt;= 1000) {
    if(flag) {digitalWrite(LED, LOW); flag = false;}
    else   {digitalWrite(LED, HIGH); flag = true;}
    i = 0;
}
delay(1);
}</code></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码功能:初始化Serial和Serial1,及GPIO10(板载LED控制脚),然后实现串0收转串1发,串1发转串0收,LED则闪烁灯指示程序在运行。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码中Serial1初始化因为要配置收发管脚,所以传递了四个参数。Serial.available()函数实际返回串口接收缓存队列的长度,因为收到一个字节就会条件成立,所以使用了read()函数去读取一个字节。如果想读取多个字节(可用来自于HardwareSerial超类Stream的readString()、readBytes()等API),本人的经验是在if语句块中加入适当的延时,等到接收完毕后再去读取。</p>

<p>&nbsp;</p>

<p class="imagemiddle" style="text-align: center;"></p>

<p align="center">图5-3&nbsp;两个串口互相收发效果</p>

<p align="center">&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2022-8-13 17:51

<p>在if语句块中加入适当的延时,等到接收完毕后再去读取</p>

<p>这个经验值得收藏</p>

sonicfirr 发表于 2022-8-13 18:48

Jacktang 发表于 2022-8-13 17:51
在if语句块中加入适当的延时,等到接收完毕后再去读取

这个经验值得收藏

<p>以前搞Arduino总结的办法,谢谢收藏</p>

小智啊 发表于 2023-4-16 12:01

请问博主有硬件连接图吗
页: [1]
查看完整版本: 【Beetle ESP32-C3】五、开启两个UART(Arduino)