前言
近期因项目需求,对LoRa透传模块进行测试学习。
本次测试的模块是成都ebyte公司的LoRa模块,型号为SX1268。该模块采用串口透传模式。
本博客主要记录了模块的定点传输模式,透传模式相对简单,可以参考大多数的串口通信代码。
什么是串口透传?
所谓串口透传,就是不管所传输的内容、数据协议形式。只是把需要传输的内容当成一组二进制数据完美地传输到接收端。不对要传的数据做任何处理。
mcu都有串口,串口也是最简单、最常见的mcu通讯方式。而串口透传实际上使用的其他的通讯方式,比如以太网、蓝牙、zigbee、gprs等等,而串口数据作为这些协议帧中的数据区。本质上是其他通讯方法。但是对于嵌入式的开发者来说,实际上是对串口进行编程,对数据的接收、发送都是使用串口。而数据的传输实际是通过其他方式,透传模块(或芯片)负责把串口数据以其他方式(比如蓝牙)发送、同时也把收到的数据转化成串口数据。这样对于嵌入式mcu(嵌入式程序员)这些模块相当于透明的。使用透传模块可以简化编程(不用实现复杂的协议栈)、增加灵活性(模块化,更换透传模块可以改变通讯方式)、使老设备具有新的通讯方式(以前的设备可能并没有源码,只增加透传模块就可利用现在高级网络)。
故本文对于同样是串口透传方式进行通信的模块,皆具有一定的参考价值。
实现过程
模块配置
本次使用了四块LoRa模块进行实验。使用官方提供的配置软件。官方的配置软件可以通过如下渠道获得:
登录ebyte官网/资料下载页面:http://www.ebyte.com/data-download.html?page=3&id=37&cid=31#load
在网页中选择:软件工具/参数设置软件,找到E22系列对应的版本进行下载
对四个模块分别进行配置。需要修改的参数有传输方式、模块地址和模块信道三项。如下图所示:
对于四个模块的配置参数分别按照以下表格进行设置:
模块调试
为测试模块功能是否正常,在使用前先使用串口调试助手进行调试。
串口调试助手同样可以在上面网站的资源列表进行下载,大多数版本的串口助手都是适用的。
将四个LoRa模块全部接入笔记本电脑,打开各自的串口,进行发送测试。出现以下结果说明模块按照配置的参数能够正常工作。
在定点传输功能中,数据并不像透传方式,会广播至该信道下的所有终端,而是仅会传输至事先定义的目标地址处。在本次测试下的四块LoRa模块发送方与接收方关系如下图所示:
代码编写
本博客给出了windows和linux系统的通信demo,相对简单,供刚拿到模块的同学扩展学习。
定点传输模式实现效果:
地址为2的模块向地址为3的模块定点发送内容(信道编号为5)。有关参数根据自己所需的要求灵活修改。
windows版本代码(VS2019)
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
HANDLE hcom;
hcom = CreateFile(L"COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING //连接了电脑的COM4口
, FILE_ATTRIBUTE_NORMAL, NULL);
if (hcom == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "打开串口失败!\n");
exit(0);
}
SetupComm(hcom, 1024, 1024);
DCB dcb;
GetCommState(hcom, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 1;
SetCommState(hcom, &dcb);
char v2vbuff[] = { 0x00, 0x03, 0x05, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; //向地址为3,信道为5的目标发送16进制的内容AA BB CC DD EE FF
DWORD dwWrittenLen = 0;
int k = 0;
for (;;) {
if (!WriteFile(hcom, v2vbuff, 9, &dwWrittenLen, NULL))
{
fprintf(stderr, "发送数据失败!\n");
}
k++;
printf("往串口发送数据成功!第%d次\n", k);
Sleep(1000); //1s发送一次
}
return 0;
}
linux版本代码(基于树莓派)
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int running = 1;
void sig_handle(int sig)
{
if(sig == SIGINT)
running = 0;
}
signal(SIGINT, sig_handle);
int fd;
if(wiringPiSetup() < 0)
{
printf("wiringPi setup failed.\n");
return 1;
}
int baudrate = 9600;
if((fd = serialOpen("/dev/ttyUSB0",baudrate)) < 0)
{
printf("serial open failed.\n");
return 1;
}
serialPrintf(fd, "Connect with LoRa success");
while(running)
{
char buff[] = {0,3,5,170,187,204,221,238,255}; //对应为16进制的0x00, 0x03, 0x05, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
write(fd,buff,9);
printf("send message success\n");
sleep(1);
}
serialClose(fd);
printf("close serial.\n");
return 0;
}
在电脑上连接地址为3的LoRa模块,使用串口调试助手打开对应的串口,运行相应代码,可以显示如下结果:
至此,LoRa模块的定点传输模式测试完成,后续更多的功能亟待开发。
参考链接
https://blog.csdn.net/bean_business/article/details/107876230
http://www.ebyte.com/data-download.html?id=39&pid=31#load
https://blog.csdn.net/dalaoadalaoa/article/details/45399343