最近使用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交流
 
