背景
应物联网无网的环境要求,需要使用Lora模块进行组网以此传输数据,本来用了正点原子的Lora模块,以正点的强大资料支持,我本应该非常熟悉这些组网操作了,但硬件调试实在是让我差不多很苦恼,一方面需要不断的去排查接线问题,一方面又要去关注软件代码是否已经发送了数据。
原因:因为用此lora模块发送完数据后,用TTL在桌面串口助手上查看,但它没有回馈,这意味着不知道是否它到底发送是否成功,不知道是否有其他地方被我疏忽了,欢迎同行赐教。
配上正点的lora
接线
这里在我测试的时候,有时成功后过一段时间再次进行测试则又连不上,也许是因为接线的问题(这是硬件调试的通病)。
关于更新固件
解决用上位机设置后丢失保存的问题。
正点原子LORA模块ATK-01固件升级与断电不丢失设置参数_昊月光华的博客-CSDN博客
定向传输
引用正点的文档
1)点对点 1,模块发送时可修改地址和信道,用户可以指定数据发送到任意地址和信道。 2,可以实现组网和中继功能。 发送模块(1 个):地址+信道+数据 接收模块(1 个):数据 点对点(透传):模块地址、信道、速率相同 点对点(定向):模块地址可变、信道可变,速率相同 图 2.4.2.1 定向传输(点对点) 例如: 设备 A 地址 0X1234,信道 0X17; 设备 B 地址 0xABCD,信道 0X01; 设备 C 地址 0X1256,信道 0x13。 设备 A 发送:AB CD 01 AA BB CC DD 设备 B 接收:AA BB CC DD 设备 C 接收:无 设备 A 发送:12 56 13 AA BB CC DD 设备 B 接收:无 设备 C 接收:AA BB CC D
STM32整合
像精英版,探索版都提供了lora的ATK接口,(这里的ATK-MOUDLE接口对应lora上的MD0和AUX对应的引脚需要拉低)省去了接线的麻烦。
贯彻与大道至简的原则,我没有像正点那样在程序运行过程中去通过AT指令更改LORA的工作模式,能通过先配置再使用再好不过(当做无线串口用是再方便不过的了)
先在一台电脑通过USB转TTL接多个LORA节点做测试:
发送的前3个字节为16进制,这里在调试的时候需要注意。
比如我以三个lora为例(下面分别叫做A,B,C):定向传输信道可以不同,地址可以不同,速率必须相同
Alora:地址613(16位 0-65535) 信道为15
Blora:地址614(16位 0-65535) 信道为15
Clora:地址615(16位 0-65535) 信道为15(最大信道为32,越好的LORA模块,信道数量越多,受相邻信道干扰的可能性越小!)
A和B发送给C(让其做中心节点)的实例:
C的地址为615 信道为15 其十六进制为 0X02 0X67 0X0F。当让一台电脑接多个LORA节点做测试时,发送配置为16进制(HEX格式发送),每两位为一个字节,所以测试发送的数据必须是偶数。至于为什么我写得如此详细,是因为发送成功才能看到结果,发送失败是没有任何错误回馈的!这为了排查是软件原因还是硬件原因。
Alora ,Blora发送
Clora收到:
STM32测试
配置串口为DMA的发送模式,串口的全局中断,串口DMA发送中断打开。
//定向传输 信道加地址
u8 Rx3sBuf[300]={0X02,0X67,0X0F}; // Rx3发送数据缓存数组
#define LoraData "{\"data\": \"%s\"}"
//通过Lora发送给巡检中心节点
void SendMessageByUsart3(const char * src){
char temp[100]={0};
u16 len=0;
//清空缓存数组
memset(Rx3sBuf,0x00,sizeof(Rx3sBuf));
//设置报文前缀
Rx3sBuf[0]=0x02;
Rx3sBuf[1]=0x67;
Rx3sBuf[2]=0x0F;
sprintf(temp, LoraData, src);
len = strlen(temp);
temp[len++]='\r';
temp[len++]='\n';
temp[len]='\0';
strcat(Rx3sBuf, temp);
HAL_UART_Transmit_DMA(&huart3,Rx3sBuf,len+3);
}
用Cloira用USB转TTL接在电脑上,测试正确、