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