前言
近期因項目需求,對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