ESP32S3配置LORA(有人物联网)

最近使用ESP32配置做了LoRa的项目,将一些笔记和心得记录一下。

LoRa的工作模式主要有透传和定点传输两种模式,应该还有一个主从模式,但是我还没有使用过,我主要记录一下定点传输。

透传模式下通讯发送方和接收方需要满足三个条件:

1.速率等级一致

2.信道一致

3.目标地址相同或为广播地址

透传没啥可说的,说明书资料什么的很多,下面主要是说一下在定点通讯猜到的一些坑。

定点模式

定点模式在我的理解就是可以指定接收方(前提这个接收方是存在的),定点模式规定了数据格式的组成为:前两个字节是目标地址,第三个字节为目标信道,之后为数据包

(注:通信双方的速率等级必须一致),不然发送方都发完了,接收方还没有接收完呢

例:(有人的lora复制过来的)

示例:模块 A 以定点模式向模块 B 发送数据
1. 首先设置模块 A 为定点模式: AT+WMODE=FP
2. A B 模块 速率等级 设置一致: AT+SPD=10
3. 确认模块 B 的地址和信道,示例中模块 B 信道为 78 (0x4E) 地址为 6666 (0x1A0A)
4. 重启模块 A B
5. 模块 A 发送数据 (HEX 格式 ) 1A 0A 4E 31 32 33
6. B 模块会收到 31 32 33

接着说一下常用的AT指令

“+++”+“a”进入配置模式

 AT+WMODE 设置定点模式  

AT+SPD 设置速率等级

AT+ADDR  设置地址

AT+CH 设置信号

AT+Z 装置重启

代码部分 

这个是LoRa设置代码,我在配置LoRa最后一步加入了AT+Z指令,因为我懒得写退出配置模式的代码,主要每个指令的延时!!!

HardwareSerial MySerial(0);  //定义串口
HardwareSerial MySerial1(1);
#define UAST_write MySerial1.write
#define UAST_available MySerial1.available
#define UAST_read MySerial1.read
#define UAST_println MySerial1.println
#define UAST_print MySerial1.print
/**************************************
函数名称:LoRa
函数功能:读取LoRa返回值
函数参数:地址、信道
函数返回值:lora接收到的字符串
**************************************/
String LoRa()
{
  if(UAST_available()>0)
  {
    Lora="";
    while(UAST_available()>0)
    {
      Lora+=(char)UAST_read();
      delay(2);
    }
  }
  return Lora;
}
/**************************************
函数名称:setLoRa
函数功能:读取LoRa返回值
函数参数:地址、信道
函数返回值:lora接收到的字符串
**************************************/
bool setLoRa()
{
  
  UAST_print("AT+ENTM\r\n");
  delay(50);
  while(1)
  {
    UAST_print("+++");
    delay(50);
    UAST_print("a");
    delay(50);
    MySerial.println("+++");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;

  }
  while(1)
  {
    UAST_print("AT+WMODE=FP\r\n");
    delay(50);
    MySerial.println("wmode");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  while(1)
  {
    UAST_print("AT+CH=21\r\n");
    delay(50);
    MySerial.println("ch");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  while(1)
  {
    UAST_print("AT+SPD=10\r\n");
    delay(50);
    MySerial.println("spd");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  while(1)
  {
    UAST_print("AT+PWR=20\r\n");
    delay(50);
    MySerial.println("pwr");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  while(1)
  {
    UAST_print("AT+ADDR=8888\r\n");
    delay(50);
    MySerial.println("addr");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  while(1)
  {
    UAST_print("AT+Z\r\n");
    delay(50);
    MySerial.println("Z");
    String Lora=LoRa();
    const char* LORA=Lora.c_str();
    if(strstr(LORA,"OK")!=NULL) break;
  }
  return 1;
}

数据发送代码

extern HardwareSerial MySerial;
extern HardwareSerial MySerial1;
char str[]={0x22,0xB8,0x15,0x0d,0x11,0x00,0x11,0x0a};
void setup() {

  MySerial.begin(115200);
  MySerial1.begin(115200,SERIAL_8N1,17,18);
  delay(20);

  k=setLoRa();   
  while(k)
  {
    k=0;
    Tlag=1;
  }

}
void loop() {

while (Tlag) {


      MySerial1.write(str,sizeof(str));
      delay(50);//这个东西very very very 重要!!!!
}

}

最后,有不懂的欢迎联系我,因为完整代码包含一些其他封装的函数,为了避免干扰思路,我就摘出来了lora部分 *********总之不懂得留下邮箱或者qq交流

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值