这是需要可靠的915MHz长距离广域通信应用的理想解决方案
A
A
硬件概览
它是如何工作的?
LR 11 Click - 915MHz 基于 Ezurio 的 453-00139R,这是一款超低功耗的 LoRaWAN 模块,属于 Ezurio RM126x 系列,特别是 RM1262。该模块集成了 Silicon Labs 的 EFR32 系列系统芯片 (SoC) 和 Semtech 的 SX1262 射频芯片,提供了一个高效、低功耗、长距离的解决方案,用于开发广泛的 LoRaWAN™ 应用,并获得 LoRa 联盟的认证。该模块配备了内置的 MHF4 连接器、温度补偿晶体振荡器 (TCXO) 和 DC-DC 转换器,确保在各种环境中的可靠性能。453-00139R 支持 LoRaWAN 类别 A、B 和 C,提供安全、可扩展和双向通信。它具有广泛的监管区域支持,包括美国、加拿大、澳大利亚和新西兰,并拥有 EU、UKCA、NCC、MIC 和 IN 等认证,使其成为各种需要可靠长距离通信的用例的高效解决方案。除了 LoRaWAN 功能外,453-00139R 还具有 LoRa 点对点 (LoRa P2P) 功能,支持在两个 RM126x 模块之间创建私有的超长距离无线电网络。该功能支持单播和广播模式,每个网络可容纳多达 64 台设备。该模块设计为可在主机模式和无主机模式下操作。在主机模式下,它通过 AT 命令集进行编程,
而在无主机模式下,它使用其内置的 Cortex-M33 核心,具有 512kB 闪存和 32kB RAM。模块的主要特性还包括 902-928MHz 的频率范围(典型为 915MHz)、最大发射功率可达 22dBm,以及在开放空间中的通信范围可达 15 公里。此 Click board™ 是物联网设备、资产跟踪与控制、智能家居系统、公用或私有网络、灌溉与农业应用、工业自动化及任何长距离、依赖电池供电的传感器应用的理想选择。453-00139R 模块与主机 MCU 通过 UART 接口进行通信,使用标准的 UART RX 和 TX 引脚,以及硬件流控制引脚(CTS/RTS- Clear to Send/Ready to Send)以实现高效的数据传输。默认通信速度为 115200bps,允许通过 AT 命令进行数据交换。在 LR 11 Click 的底部,有一个额外的未填充接头,提供对调试和编程功能的全面支持。通过此接头,用户可以使用串行线调试接口(通过 SWD 接口引脚 SWDIO、SWCLK 和 SWO 提供)进行编程和调试。除了接口引脚外,该 Click board™ 还具有一个复位引脚/按钮 (RESET) 用于直接重置模块,以及一个 BOOT 按钮用于确定何时执行引导加载程序。复位后,引导加载
程序开始执行。当按下 BOOT 按钮时,引导加载程序通过 UART 执行固件更新。松开按钮时,引导加载程序停止执行并将控制权交给主应用固件。LR 11 Click 的一个特殊功能是额外的 mikroBUS™ 插座,它通过 UART、SPI 或 I2C 接口与板载的 453-00139R 模块通信,为外设(如传感器和 LCD)扩展了板子的功能。由于 453-00139R 的 GPIO PD02 和 PD03 引脚在多个信号之间共享(可用于所有三个接口),因此在选择通信模式时必须适当地配置它们。这可以通过位于外围 mikroBUS™ 插座部分的六个焊盘来实现,使得模块的 PD02 和 PD03 引脚可以设置为所需的接口。默认情况下,选择 SPI 通信,并连接 CIPO 和 COPI 引脚。如果需要其他接口,则需要切断这些走线(断开它们),然后焊接所需接口引脚(UART 或 I2C)的焊盘。此 Click board™ 拥有外围 mikroBUS™ 插座所需的两个 mikroBUS™ 电源轨,但仅使用 3.3V 电压作为 453-00139R 模块的主电源。在使用具有不同逻辑电平的 MCU 之前,必须执行适当的逻辑电压电平转换。它还配备了包含功能和示例代码的库,可作为进一步开发的参考。
功能概述
开发板
Clicker 2 for Kinetis 是一款紧凑型入门开发板,它将 Click 板™的灵活性带给您喜爱的微控制器,使其成为实现您想法的完美入门套件。它配备了一款板载 32 位 ARM Cortex-M4F 微控制器,NXP 半导体公司的 MK64FN1M0VDC12,两个 mikroBUS™ 插槽用于 Click 板™连接,一个 USB 连接器,LED 指示灯,按钮,一个 JTAG 程序员连接器以及两个 26 针头用于与外部电子设备的接口。其紧凑的设计和清晰、易识别的丝网标记让您能够迅速构建具有独特功能和特性
的小工具。Clicker 2 for Kinetis 开发套件的每个部分 都包含了使同一板块运行最高效的必要组件。除了可以选择 Clicker 2 for Kinetis 的编程方式,使用 USB HID mikroBootloader 或外部 mikroProg 连接器进行 Kinetis 编程外,Clicker 2 板还包括一个干净且调节过的开发套件电源供应模块。它提供了两种供电方式;通过 USB Micro-B 电缆,其中板载电压调节器为板上每个组件提供适当的电压水平,或使用锂聚合物 电池通过板载电池连接器供电。所有 mikroBUS™ 本
身支持的通信方法都在这块板上,包括已经建立良好的 mikroBUS™ 插槽、重置按钮和几个用户可配置的按钮及 LED 指示灯。Clicker 2 for Kinetis 是 Mikroe 生态系统的一个组成部分,允许您在几分钟内创建新的应用程序。它由 Mikroe 软件工具原生支持,得益于大量不同的 Click 板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作的许多方面。
微控制器概述
MCU卡片 / MCU
建筑
ARM Cortex-M4
MCU 内存 (KB)
1024
硅供应商
NXP
引脚数
121
RAM (字节)
262144
你完善了我!
配件
Sub-GHz FlexDIPOLE天线,特别是Ezurio 868/915 MHz型号,是一款紧凑且高度多功能的天线,设计用于在整个868和915 MHz ISM频段内提供强大且一致的性能。其小巧的尺寸与灵活的偶极天线技术相结合,使其成为LoRaWAN和其他Sub-GHz技术等苛刻应用的理想选择。该天线配备了MHF4L连接器选项,确保易于集成到各种系统中。此外,其背胶设计允许快速且简便的安装,在挑战性的实际环境中提供从863到928 MHz的可靠覆盖。
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图
一步一步来
项目组装
实时跟踪您的结果
应用程序输出
此款Click板可通过两种方式进行接口连接和监控:
Application Output
- 在调试模式下,使用“Application Output”窗口进行实时数据监控。按照本教程正确设置它。
UART Terminal
- 通过UART终端使用USB to UART converter监控数据有关详细说明,请查看本教程。
软件支持
库描述
该库包含 LR 11 Click - 915MHz 驱动程序的 API
关键功能:
lr11915mhz_reset_device
- 此函数通过切换复位引脚的逻辑状态来重置设备。lr11915mhz_cmd_run
- 此函数向 Click 模块发送指定的命令(带或不带参数)。lr11915mhz_cmd_set
- 此函数为 Click 模块的指定命令参数设置值。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief LR 11 915MHz Click Example.
*
* # Description
* This example demonstrates the use of LR 11 915MHz click board by showing
* the communication between two click boards configured in P2P network mode.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver and logger.
*
* ## Application Task
* Application task is split in few stages:
* - LR11915MHZ_POWER_UP:
* Powers up the device, performs a device factory reset and reads system information.
* - LR11915MHZ_CONFIG_EXAMPLE:
* Configures device for the LoRa P2P network mode.
* - LR11915MHZ_EXAMPLE:
* Performs a LoRa P2P example by exchanging messages with another LR 11 915MHz click board.
* One device should be set to NODE_0_ADDRESS, and the other to NODE_1_ADDRESS.
*
* ## Additional Function
* - static void lr11915mhz_clear_app_buf ( void )
* - static void lr11915mhz_log_app_buf ( void )
* - static err_t lr11915mhz_process ( lr11915mhz_t *ctx )
* - static err_t lr11915mhz_read_response ( lr11915mhz_t *ctx, uint8_t *rsp )
* - static err_t lr11915mhz_power_up ( lr11915mhz_t *ctx )
* - static err_t lr11915mhz_config_example ( lr11915mhz_t *ctx )
* - static err_t lr11915mhz_example ( lr11915mhz_t *ctx )
*
* @author Stefan Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "lr11915mhz.h"
#include "conversions.h"
#include "generic_pointer.h"
// Node address selection macros
#define NODE_0_ADDRESS 0
#define NODE_1_ADDRESS 1
#define NODE_ADDRESS NODE_0_ADDRESS
// Text message for transmittion
#define DEMO_TEXT_MESSAGE "MIKROE - LR 11 915MHz click board"
static lr11915mhz_t lr11915mhz;
static log_t logger;
// Application buffer size
#define APP_BUFFER_SIZE 600
#define PROCESS_BUFFER_SIZE 200
static uint8_t app_buf[ APP_BUFFER_SIZE ] = { 0 };
static int32_t app_buf_len = 0;
/**
* @brief Example states.
* @details Predefined enum values for application example state.
*/
typedef enum
{
LR11915MHZ_POWER_UP = 1,
LR11915MHZ_CONFIG_EXAMPLE,
LR11915MHZ_EXAMPLE
} lr11915mhz_app_state_t;
static lr11915mhz_app_state_t app_state = LR11915MHZ_POWER_UP;
/**
* @brief LR 11 915MHz clearing application buffer.
* @details This function clears memory of application buffer and reset its length.
* @note None.
*/
static void lr11915mhz_clear_app_buf ( void );
/**
* @brief LR 11 915MHz log application buffer.
* @details This function logs data from application buffer to USB UART.
* @note None.
*/
static void lr11915mhz_log_app_buf ( void );
/**
* @brief LR 11 915MHz data reading function.
* @details This function reads data from device and concatenates data to application buffer.
* @param[in] ctx : Click context object.
* See #lr11915mhz_t object definition for detailed explanation.
* @return @li @c 0 - Read some data.
* @li @c -1 - Nothing is read.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t lr11915mhz_process ( lr11915mhz_t *ctx );
/**
* @brief LR 11 915MHz read response function.
* @details This function waits for a response message, reads and displays it on the USB UART.
* @param[in] ctx : Click context object.
* See #lr11915mhz_t object definition for detailed explanation.
* @param[in] rsp Expected response.
* @return @li @c 0 - OK response.
* @li @c -2 - Timeout error.
* @li @c -3 - Command error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t lr11915mhz_read_response ( lr11915mhz_t *ctx, uint8_t *rsp );
/**
* @brief LR 11 915MHz power up function.
* @details This function powers up the device, performs device factory reset and reads system information.
* @param[in] ctx : Click context object.
* See #lr11915mhz_t object definition for detailed explanation.
* @return @li @c 0 - OK.
* @li @c != 0 - Read response error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t lr11915mhz_power_up ( lr11915mhz_t *ctx );
/**
* @brief LR 11 915MHz config example function.
* @details This function configures device for LoRa P2P example.
* @param[in] ctx : Click context object.
* See #lr11915mhz_t object definition for detailed explanation.
* @return @li @c 0 - OK.
* @li @c != 0 - Read response error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t lr11915mhz_config_example ( lr11915mhz_t *ctx );
/**
* @brief LR 11 915MHz example function.
* @details This function performs a LoRa P2P example by exchanging messages with another LR 11 915MHz click board.
* @param[in] ctx : Click context object.
* See #lr11915mhz_t object definition for detailed explanation.
* @return @li @c 0 - OK.
* @li @c != 0 - Read response error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t lr11915mhz_example ( lr11915mhz_t *ctx );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
lr11915mhz_cfg_t lr11915mhz_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
lr11915mhz_cfg_setup( &lr11915mhz_cfg );
LR11915MHZ_MAP_MIKROBUS( lr11915mhz_cfg, MIKROBUS_1 );
if ( UART_ERROR == lr11915mhz_init( &lr11915mhz, &lr11915mhz_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
log_info( &logger, " Application Task " );
app_state = LR11915MHZ_POWER_UP;
log_printf( &logger, ">>> APP STATE - POWER UP <<<\r\n\n" );
}
void application_task ( void )
{
switch ( app_state )
{
case LR11915MHZ_POWER_UP:
{
if ( LR11915MHZ_OK == lr11915mhz_power_up( &lr11915mhz ) )
{
app_state = LR11915MHZ_CONFIG_EXAMPLE;
log_printf( &logger, ">>> APP STATE - CONFIG EXAMPLE <<<\r\n\n" );
}
break;
}
case LR11915MHZ_CONFIG_EXAMPLE:
{
if ( LR11915MHZ_OK == lr11915mhz_config_example( &lr11915mhz ) )
{
app_state = LR11915MHZ_EXAMPLE;
log_printf( &logger, ">>> APP STATE - EXAMPLE <<<\r\n\n" );
}
break;
}
case LR11915MHZ_EXAMPLE:
{
lr11915mhz_example( &lr11915mhz );
break;
}
default:
{
log_error( &logger, " APP STATE." );
break;
}
}
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
static void lr11915mhz_clear_app_buf ( void )
{
memset( app_buf, 0, app_buf_len );
app_buf_len = 0;
}
static void lr11915mhz_log_app_buf ( void )
{
for ( int32_t buf_cnt = 0; buf_cnt < app_buf_len; buf_cnt++ )
{
log_printf( &logger, "%c", app_buf[ buf_cnt ] );
}
}
static err_t lr11915mhz_process ( lr11915mhz_t *ctx )
{
uint8_t rx_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
int32_t overflow_bytes = 0;
int32_t rx_cnt = 0;
int32_t rx_size = lr11915mhz_generic_read( ctx, rx_buf, PROCESS_BUFFER_SIZE );
if ( ( rx_size > 0 ) && ( rx_size <= APP_BUFFER_SIZE ) )
{
if ( ( app_buf_len + rx_size ) > APP_BUFFER_SIZE )
{
overflow_bytes = ( app_buf_len + rx_size ) - APP_BUFFER_SIZE;
app_buf_len = APP_BUFFER_SIZE - rx_size;
memmove ( app_buf, &app_buf[ overflow_bytes ], app_buf_len );
memset ( &app_buf[ app_buf_len ], 0, overflow_bytes );
}
for ( rx_cnt = 0; rx_cnt < rx_size; rx_cnt++ )
{
if ( rx_buf[ rx_cnt ] )
{
app_buf[ app_buf_len++ ] = rx_buf[ rx_cnt ];
}
}
return LR11915MHZ_OK;
}
return LR11915MHZ_ERROR;
}
static err_t lr11915mhz_read_response ( lr11915mhz_t *ctx, uint8_t *rsp )
{
#define READ_RESPONSE_TIMEOUT_MS 30000
uint32_t timeout_cnt = 0;
lr11915mhz_clear_app_buf ( );
lr11915mhz_process( ctx );
while ( ( 0 == strstr( app_buf, rsp ) ) &&
( 0 == strstr( app_buf, LR11915MHZ_RSP_ERROR ) ) )
{
lr11915mhz_process( ctx );
if ( timeout_cnt++ > READ_RESPONSE_TIMEOUT_MS )
{
lr11915mhz_clear_app_buf( );
log_error( &logger, " Timeout!" );
return LR11915MHZ_ERROR_TIMEOUT;
}
Delay_ms( 1 );
}
Delay_ms ( 200 );
lr11915mhz_process( ctx );
if ( strstr( app_buf, rsp ) )
{
lr11915mhz_log_app_buf( );
log_printf( &logger, "--------------------------------\r\n" );
return LR11915MHZ_OK;
}
lr11915mhz_log_app_buf( );
return LR11915MHZ_ERROR_CMD;
}
static err_t lr11915mhz_power_up ( lr11915mhz_t *ctx )
{
err_t error_flag = LR11915MHZ_OK;
log_printf( &logger, ">>> Reset device.\r\n" );
lr11915mhz_reset_device( &lr11915mhz );
while ( LR11915MHZ_OK == lr11915mhz_process( ctx ) )
{
lr11915mhz_log_app_buf( );
lr11915mhz_clear_app_buf ( );
}
log_printf( &logger, "--------------------------------\r\n" );
log_printf( &logger, ">>> Factory reset.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_FACTORY_RESET, NULL );
error_flag |= lr11915mhz_read_response( &lr11915mhz, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Check communication.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_AT, NULL );
error_flag |= lr11915mhz_read_response( &lr11915mhz, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Get device type.\r\n" );
lr11915mhz_cmd_run( ctx, LR11915MHZ_CMD_GET_INFO, LR11915MHZ_PARAM_DEVICE_TYPE );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Get firmware version.\r\n" );
lr11915mhz_cmd_run( ctx, LR11915MHZ_CMD_GET_INFO, LR11915MHZ_PARAM_APP_FW_VERSION );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
return error_flag;
}
static err_t lr11915mhz_config_example ( lr11915mhz_t *ctx )
{
uint8_t data_buf[ 10 ] = { 0 };
err_t error_flag = LR11915MHZ_OK;
#define DEVICE_CLASS_P2P "3"
log_printf( &logger, ">>> Set LoRa operation to P2P.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_DEVICE_CLASS, DEVICE_CLASS_P2P );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define REGION_US902_928 "3"
log_printf( &logger, ">>> Set operation region to US902_928.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_REGION, REGION_US902_928 );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
int16_to_str ( NODE_ADDRESS, data_buf );
l_trim ( data_buf );
r_trim ( data_buf );
log_printf( &logger, ">>> Set P2P node address to %s.\r\n", data_buf );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_DEVICE_ADDRESS, data_buf );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_NETWORK_SIZE "2"
log_printf( &logger, ">>> Set P2P network size to %s nodes.\r\n", ( char * ) P2P_NETWORK_SIZE );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_NET_SIZE, P2P_NETWORK_SIZE );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_DATA_RATE_DR2 "2"
log_printf( &logger, ">>> Set P2P data rate to DR2.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_DATA_RATE, P2P_DATA_RATE_DR2 );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_LISTEN_DURATION "0"
log_printf( &logger, ">>> Set P2P listen duration to 0.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_LISTEN_DURATION, P2P_LISTEN_DURATION );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_LISTEN_INTERVAL "0"
log_printf( &logger, ">>> Set P2P listen interval to 0.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_LISTEN_INTERVAL, P2P_LISTEN_INTERVAL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_BEACON_DATA_RATE_DR2 "2"
log_printf( &logger, ">>> Set P2P beacon data rate to DR2.\r\n" );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_BEACON_DATA_RATE, P2P_BEACON_DATA_RATE_DR2 );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
#define P2P_TX_POWER "1"
log_printf( &logger, ">>> Set P2P TX power to %s dBm.\r\n", ( char * ) P2P_TX_POWER );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_TX_POWER, P2P_TX_POWER );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Save settings.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_SAVE_SETTINGS, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Reboot.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_WARM_RESET, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Get P2P maximum packet size.\r\n" );
lr11915mhz_cmd_run( ctx, LR11915MHZ_CMD_GET_INFO, LR11915MHZ_PARAM_P2P_SLOT_PACKET_SIZE );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
int16_t packet_size = atoi( &app_buf[ 1 ] ) - 1;
if ( packet_size < strlen ( DEMO_TEXT_MESSAGE ) )
{
log_error( &logger, " DEMO_TEXT_MESSAGE length [%d] exceeds the packet size limit [%d].\r\n",
( int16_t ) strlen ( DEMO_TEXT_MESSAGE ), packet_size );
for ( ; ; );
}
int16_to_str ( strlen ( DEMO_TEXT_MESSAGE ), data_buf );
l_trim ( data_buf );
r_trim ( data_buf );
log_printf( &logger, ">>> Set P2P packet size to %s.\r\n", data_buf );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_PACKET_SIZE, data_buf );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Save settings.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_SAVE_SETTINGS, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Reboot.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_WARM_RESET, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Get P2P minimum window length.\r\n" );
lr11915mhz_cmd_run( ctx, LR11915MHZ_CMD_GET_INFO, LR11915MHZ_PARAM_P2P_MIN_WINDOW_LENGTH );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
int16_t window_len = atoi( &app_buf[ 1 ] ) + 1;
int16_to_str ( window_len, data_buf );
l_trim ( data_buf );
r_trim ( data_buf );
log_printf( &logger, ">>> Set P2P window length to %s.\r\n", data_buf );
lr11915mhz_cmd_set( ctx, LR11915MHZ_CMD_PARAM_ACCESS_NUM, LR11915MHZ_PARAM_ID_P2P_WINDOW_LENGTH, data_buf );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Save settings.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_SAVE_SETTINGS, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Reboot.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_WARM_RESET, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
log_printf( &logger, ">>> Start a P2P session.\r\n" );
lr11915mhz_cmd_run( &lr11915mhz, LR11915MHZ_CMD_P2P_START_SESSION, NULL );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
return error_flag;
}
static err_t lr11915mhz_example ( lr11915mhz_t *ctx )
{
err_t error_flag = LR11915MHZ_OK;
uint8_t param_buf[ 120 ] = { 0 };
uint8_t msg_hex[ 101 ] = { 0 };
uint8_t byte_hex[ 3 ] = { 0 };
uint8_t src_addr[ 10 ] = { 0 };
uint8_t source[ 10 ] = { 0 };
uint8_t rssi[ 10 ] = { 0 };
uint8_t snr[ 10 ] = { 0 };
uint8_t cnt = 0;
memset( msg_hex, 0, sizeof ( msg_hex ) );
for ( cnt = 0; ( cnt < strlen ( DEMO_TEXT_MESSAGE ) ) && ( cnt < 50 ); cnt++ )
{
uint8_to_hex ( DEMO_TEXT_MESSAGE[ cnt ], byte_hex );
strcat ( msg_hex, byte_hex );
}
#if ( NODE_ADDRESS == NODE_0_ADDRESS )
int16_to_str ( NODE_1_ADDRESS, param_buf );
l_trim ( param_buf );
r_trim ( param_buf );
#else
int16_to_str ( NODE_0_ADDRESS, param_buf );
l_trim ( param_buf );
r_trim ( param_buf );
#endif
log_printf( &logger, ">>> Send message \"%s\" to node address %s.\r\n", ( char * ) DEMO_TEXT_MESSAGE, param_buf );
strcat ( param_buf, ", \"" );
strcat ( param_buf, msg_hex );
strcat ( param_buf, "\"" );
lr11915mhz_cmd_run( ctx, LR11915MHZ_CMD_P2P_SEND_DATA, param_buf );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_RSP_OK );
if ( LR11915MHZ_OK == error_flag )
{
memset( msg_hex, 0, sizeof ( msg_hex ) );
log_printf( &logger, ">>> Waiting for a P2P RX message.\r\n" );
error_flag |= lr11915mhz_read_response( ctx, LR11915MHZ_EVT_RX_P2P );
}
else
{
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
Delay_ms ( 1000 );
}
if ( LR11915MHZ_OK == error_flag )
{
uint8_t * __generic_ptr start_ptr = strstr( app_buf, LR11915MHZ_EVT_RX_P2P );
uint8_t * __generic_ptr end_ptr = NULL;
if ( start_ptr )
{
start_ptr = start_ptr + strlen ( LR11915MHZ_EVT_RX_P2P );
end_ptr = strstr ( start_ptr, "," );
memcpy ( source, start_ptr, end_ptr - start_ptr );
start_ptr = strstr ( end_ptr, ":" ) + 1;
end_ptr = strstr ( start_ptr, "," );
memcpy ( rssi, start_ptr, end_ptr - start_ptr );
start_ptr = strstr ( end_ptr, ":" ) + 1;
end_ptr = strstr ( start_ptr, "," );
memcpy ( snr, start_ptr, end_ptr - start_ptr );
start_ptr = end_ptr + 2;
end_ptr = strstr ( start_ptr, "\n" );
memcpy ( msg_hex, start_ptr, end_ptr - start_ptr );
for ( cnt = 0; cnt < strlen ( msg_hex ); cnt += 2 )
{
msg_hex[ cnt / 2 ] = hex_to_uint8 ( &msg_hex [ cnt ] );
}
msg_hex[ cnt / 2 ] = 0;
log_printf( &logger, ">>> Parse received message.\r\n" );
log_printf ( &logger, " Source address: %s\r\n", source );
log_printf ( &logger, " Message: %s\r\n", msg_hex );
log_printf ( &logger, " RSSI: %s\r\n", rssi );
log_printf ( &logger, " SNR: %s\r\n", snr );
log_printf( &logger, "--------------------------------\r\n" );
}
}
return error_flag;
}
// ------------------------------------------------------------------------ END