赞
踩
最近使用ESP32配置做了LoRa的项目,将一些笔记和心得记录一下。
LoRa的工作模式主要有透传和定点传输两种模式,应该还有一个主从模式,但是我还没有使用过,我主要记录一下定点传输。
透传模式下通讯发送方和接收方需要满足三个条件:
1.速率等级一致
2.信道一致
3.目标地址相同或为广播地址
透传没啥可说的,说明书资料什么的很多,下面主要是说一下在定点通讯猜到的一些坑。
定点模式
定点模式在我的理解就是可以指定接收方(前提这个接收方是存在的),定点模式规定了数据格式的组成为:前两个字节是目标地址,第三个字节为目标信道,之后为数据包
(注:通信双方的速率等级必须一致),不然发送方都发完了,接收方还没有接收完呢
例:(有人的lora复制过来的)
接着说一下常用的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交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。