ESP32学习(三),串口通信遇到的问题和相关思路(完善)

 

一、基本使用


ESP32有三个串口,编号分别为0、1、2。这里不多解释。

 

输出“hello world”的程序。

在这里插入图片描述

解单解释一下,第一部分代码是初始化函数,用来初始化串口并将串口的波特率设置为115200。第二部分是一个死循环函数,我们这里可以将其理解为while(1),他的作用就是让内部的函数一直执行,从而可以达到监视窗口的目的。

然后我们将串口数据的接收和发送程序下载到开发板(详情见上一期)

#include <HardwareSerial.h>    
HardwareSerial MySerial_stm32(1);  
unsigned short i;
char temp;
//这个函数适用于清理串口读取缓存区的缓存,其实也就是用读一个删除一个的方式清理,我还会打印出有没有进行清理,清理了哪些内容
void clear_usart_buffer(){
  i = MySerial_stm32.available();
  if(i != 0){
    Serial.print("清空串口接收区的缓存......");
    Serial.println(MySerial_stm32.available());
    while(i--)
      MySerial_stm32.read();    //读取串口接收回来的数据但是不做处理只给与打印
    }
  else
    Serial.println("串口接收区的缓存为空!!!");
  }
   
/
void read_usart(){
  i = MySerial_stm32.available();  //返回目前串口接收区内的已经接受的数据量
  if(i != 0){
    Serial.print("串口接收到的数据量为:");
    Serial.println(MySerial_stm32.available());
    while(i--){
      temp = MySerial_stm32.read();   //读取一个数据并且将它从缓存区删除
      Serial.print(temp);    //读取串口接收回来的数据但是不做处理只给与打印
      }
    Serial.println("");
    //data_analyse();    //至关重要的一步,也就是把读取回来的数据进行分步截取直接拿到我们想要的数据,我下一篇博文会讲如何自己写这个函数
    }
  else
    Serial.println("串口接收区没有数据!!!");
  }
 
void setup() {
  Serial.begin(115200);
  //串口的开启,这里还可以传一些别的参数,但是我们只传入下面四个最重要的:波特率,默认SERIAL_8N1为8位数据位、无校验、1位停止位,后面两个分别为 RXD,TXD 引脚
  MySerial_stm32.begin(115200, SERIAL_8N1, 14, 15);
  //MySerial_stm32.updateBaudRate(9600);  //重新设置波特率;  
  //MySerial_stm32.end();  //失能串口,释放占用的资源
  clear_usart_buffer();  //清空接收区缓存函数
  
}
 
void loop() {
  MySerial_stm32.println("usart test!!!");
  read_usart();
  delay(500);
  read_usart();
  delay(500);
  read_usart();
  delay(500);
}

二、存在的问题


使用Serial1(U1TXD=GPIO10,U1RXD=GPIO9)时程序无法正常运行。接收数据时只能接收到一次。这让我很是头疼。后来查阅相关资料后。发现是开发版自身的问题,《ESP32 技术规格书》中明确的写到,ESP32的GPIO6~11一般用于连接外部Flash芯片在这里插入图片描述

但是Serial1默认使用了GPIO9和10,从而导致程序崩溃:

解决方法一

使用另一个串口,但是实际操作后还是不可以。


解决方法二

使用HardwareSerial库
ESP32片上功能模组所发出的信号可映射到任何 GPIO管脚,使用Arduino core for the ESP32中自带的HardwareSerial库就可以将串口RX映射到几乎所有IO口上,TX映射到GPIO0~31上。

在这里插入图片描述

代码如下:注意RX接5号IO口,TX接18号IO口。波特率默认115200.

HardwareSerial mySerial1(1);

void setup()

{

mySerial1.begin(115200,SERIAL_8N1,5,18);

}

void loop()

{mySerial1.println("hello world");

dalay(1000);

}
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);
使能串口,参数如下:
baud:串口波特率,该值写0则会进入自动侦测波特率程序;
config:串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位;
rxPin:接收管脚针脚号;
txPin:发送管脚针脚号;
invert:翻转逻辑电平,串口默认高电平为1、低电平为0;
timeout_ms:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;

void end();
失能串口,释放资源;

void updateBaudRate(unsigned long baud);
重新设置波特率;

int available(void);
返回接收缓存可读取字节数;

int availableForWrite(void);
ESP32默认有128字节的硬件TX FIFO,该方法返回TX FIFO空闲字节数;

int peek(void);
返回接收缓存中第一个字节数据,但并不从中删除它;

int read(void);
返回接收缓存中第一个字节数据,读取过的数据将从接收缓存中清除;

void flush(void);
等待串口收发完毕;

size_t write(uint8_t);
写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上;
该方法有很多重载,可以用来发送字符串、长整型、整形;
如果TX FIFO已满,则该方法将阻塞;

size_t write(const uint8_t *buffer, size_t size);
写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞;

uint32_t baudRate();
返回当前串口波特率;

size_t setRxBufferSize(size_t);
设置接收缓存大小(默认为256字节);
ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中;


三、总结

开发板的技术说明书很重要,有时候在实际操作过程中遇到的问题,可以从技术手册中找到。

  • 11
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ESP32简易版SQLite是一种针对ESP32芯片开发的轻量级关系型数据库。SQLite是一款嵌入式数据库管理系统,相比于传统的客户端-服务器模式的数据库系统,其特点是不需要独立的服务器进程,与应用程序集成在一起,可以直接在设备上进行数据存储和查询操作。 ESP32简易版SQLite具有以下特点: 1. 轻量级:ESP32具有较小的内存和存储容量,简易版SQLite采用了精简的设计,使得其不占用过多的资源,适合在资源有限的嵌入式设备上使用。 2. 支持基本的SQL语法:SQLite支持常见的SQL语句,如创建表、插入数据、查询数据等。开发者可以使用SQL语句对数据进行操作,方便简洁。 3. 数据安全:ESP32简易版SQLite支持事务处理,可以确保数据的一致性和安全性。在多线程或多任务环境下,多个操作可以在一个事务中进行,避免数据冲突和损坏。 4. 快速响应:ESP32简易版SQLite具有高性能的特点,可以快速响应查询请求。相比于传统的数据库系统,其无需与远程服务器通信,减少了网络延迟,提高了查询的效率。 5. 易于集成和开发:ESP32简易版SQLite的API简单易用,开发者可以轻松地集成到ESP32的应用程序中。同时,SQLite提供了丰富的开发工具和支持文档,方便开发者进行调试和开发。 尽管ESP32简易版SQLite功能相对有限,但对于嵌入式设备而言,其提供了一种可行的数据存储和管理方案。通过合理使用ESP32简易版SQLite,开发者可以在资源受限的环境中进行高效的数据处理,满足应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值