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接口的说明应该都能理解了。