【ESP32】Arduino开发 | UART异步收发传输器+串口收发例程

ESP32的UART设备详细介绍会放在ESP-IDF开发文章中,可以跳转栏目目录找到。

1. API

        Arduino里面,串口是通过HardwareSerial类来实现的,系统启动时已经实例化对应的对象了,Serial、Serial1和Serial2对象分别对应串口0、1、2。

1.1 配置

void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL, uint8_t rxfifo_full_thrhd = 112);
  • baud:波特率;
  • config:通信参数配置,默认为8位数据,无校检,1位停止位;
enum SerialConfig {
    SERIAL_5N1 = 0x8000010,
    SERIAL_6N1 = 0x8000014,
    SERIAL_7N1 = 0x8000018,
    SERIAL_8N1 = 0x800001c,
    SERIAL_5N2 = 0x8000030,
    SERIAL_6N2 = 0x8000034,
    SERIAL_7N2 = 0x8000038,
    SERIAL_8N2 = 0x800003c,
    SERIAL_5E1 = 0x8000012,
    SERIAL_6E1 = 0x8000016,
    SERIAL_7E1 = 0x800001a,
    SERIAL_8E1 = 0x800001e,
    SERIAL_5E2 = 0x8000032,
    SERIAL_6E2 = 0x8000036,
    SERIAL_7E2 = 0x800003a,
    SERIAL_8E2 = 0x800003e,
    SERIAL_5O1 = 0x8000013,
    SERIAL_6O1 = 0x8000017,
    SERIAL_7O1 = 0x800001b,
    SERIAL_8O1 = 0x800001f,
    SERIAL_5O2 = 0x8000033,
    SERIAL_6O2 = 0x8000037,
    SERIAL_7O2 = 0x800003b,
    SERIAL_8O2 = 0x800003f
};
  • rxPin:接收管脚,默认不配置;
  • txPin:发送管脚,默认不配置;
  • invert:流控信号取反,默认不使能;
  • timeout_ms:波特率检测超时,默认为20000ms,如果波特率为0,初始化时会尝试使用波特率检测功能确定波特率;
  • rxfifo_full_thrhd:接收缓冲区满阈值,默认为112字节,在流控模式下才会使用。

1.2 写数据

size_t write(uint8_t);
size_t write(const uint8_t *buffer, size_t size);
inline size_t write(const char * buffer, size_t size)
{
    return write((uint8_t*) buffer, size);
}
inline size_t write(const char * s)
{
    return write((uint8_t*) s, strlen(s));
}
inline size_t write(unsigned long n)
{
    return write((uint8_t) n);
}
inline size_t write(long n)
{
    return write((uint8_t) n);
}
inline size_t write(unsigned int n)
{
    return write((uint8_t) n);
}
inline size_t write(int n)
{
    return write((uint8_t) n);
}

        write函数有好几个重载,可以传入任意的一个值,这样的话程序会将其转成数组,字符串也是可以直接传的;也可以传数组,然后第二个参数跟数组的长度。

1.3 读函数

int read(void);
size_t read(uint8_t *buffer, size_t size);
inline size_t read(char * buffer, size_t size)
{
    return read((uint8_t*) buffer, size);
}

        read函数也有几个重载,第一个是类似于清空缓冲区,只返回接收数量;后面两个就是获取数据的,只不过前者获取数组,后者获取字符串。 

1.4 检查接收缓冲区

int available(void);

         这个函数可以检查接收缓冲区是否有数据,一般在接收函数前会调用。

2. 例程

        例程会初始化串口1和串口2,串口1发生数据,串口2接收数据,间隔1秒。

#include <Arduino.h>

void setup()
{
    Serial.begin(115200);
    /* 初始化串口1 */
    Serial1.begin(115200, SERIAL_8N1, 17, 18);
    /* 初始化串口2 */
    Serial2.begin(115200, SERIAL_8N1, 21, 22);
}

void loop()
{
    /* 串口1发送 */
    const char *str = "Hello, World!";
    int send_len = Serial1.write(str, strlen(str));
    Serial.printf("Send %d bytes, data: %s\r\n", send_len, str);
    /* 串口2接收 */
    if (Serial2.available()) {
        char buf[128] = {0};
        int read_len = Serial2.read(buf, 128);
        Serial.printf("Receive %d bytes, data: %s\r\n", read_len, buf);
    }

    delay(1000);
}

        setup函数里面调用Serial1和Serial2对应的begin成员函数初始化串口,begin函数只有波特率是必须的,其他的都是缺省参数来的,就是有默认值的;默认模式是8位数据,无校检,1位停止位;串口1的默认收发管脚就是9和10,串口2的默认收发管脚就是16和17

        loop函数里面就是基本操作了,结合上面API接口的说明应该都能理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马浩同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值