中级
20 分钟

使用Wio-E5-LE和PIC32MZ2048EFM100实现远距离物联网连接

超低功耗远距离物联网通信解决方案

LR 15 Click with Curiosity PIC32 MZ EF

已发布 1月 21, 2025

点击板

LR 15 Click

开发板

Curiosity PIC32 MZ EF

编译器

NECTO Studio

微控制器单元

PIC32MZ2048EFM100

超低功耗、远距离的物联网连接,提供可靠的 LoRaWAN® 支持,适用于广泛的应用场景,包括智慧城市、农业、工业自动化和资产跟踪

A

A

硬件概览

它是如何工作的?

LR 15 Click 基于 Seeed Studio 的 Wio-E5-LE,这是一款专为超低功耗远距离通信设计的 LoRaWAN® 模块。作为 Wio-E5 系列的最新创新,Wio-E5-LE 重新定义了功耗效率,在提供高性能无线通信的同时具有极低的功耗。该模块基于 STMicroelectronics 的 STM32WLE5JC 系统级芯片(SoC)构建,集成了高性能 SX126X LoRa® 芯片和超低功耗微控制器,是需要可靠且高效能源运行的各种物联网应用(如无线抄表、传感器网络以及其他低功耗广域网络 LPWAN 应用场景)的理想选择。Wio-E5-LE 支持 LoRa® 和 (G)FSK 调制模式,提供多种通信能力。LoRa® 模式提供 62.5kHz、125kHz、250kHz 和 500kHz 的可调带宽,允许用户根据具体应用需求优化性能。该模块在 868/915MHz 频段的发射输出功率为 14dBm,在 125kHz 带宽下的 SF12 灵敏度为 -136.5dBm,并具有高达 158dB 的链接预算,确保在复杂环境中的可靠

长距离连接。模块内嵌 LoRaWAN® 协议并支持 AT 指令,能够在 EU868、US915、AU915、AS923、KR920 和 IN865 等全球频段下实现无缝集成和高效操作。此 Click board™ 采用支持 MIKROE 新推出的“Click Snap”功能的独特格式设计。与标准化版本的 Click 板不同,该功能允许通过折断 PCB 来移动主模块区域,拓展了众多新的实现可能性。借助 Snap 功能,Wio-E5-LE 可通过访问标记为 1-8 的引脚信号实现自主运行。此外,Snap 部分包含一个指定的固定螺孔位置,方便用户将 Snap 板固定在所需位置。LR 15 Click 通过 UART 接口和标准 UART RX 和 TX 引脚与主 MCU 通信,并支持 AT 指令。默认通信速度设置为 115200bps,确保高效的数据交换。它还提供了一个 I2C 接口,但需注意 I2C 接口仅能以外围模式运行。除了接口引脚外,该板还配备了复位(RST)引脚和 RESET 按钮,用于在必要时对模块进行硬复

位。模块内置的 AT 指令固件可以通过 UART 接口升级。在将模块设置为引导模式时,通过按下板上的专用 BOOT 按钮即可激活,简化了固件升级过程。此外,用户可以使用模块的内部 MCU 开发自定义软件。模块支持 SWD 接口,可实现高效的程序擦除和重新编程,为高级开发和定制提供了灵活性。该板配备了一个 u.Fl 接口,用于连接 MIKROE 提供的主 LTE 天线,例如 ISM 868/915MHz 有源 PCB 天线,以实现高效连接。除此之外,板上还包括专为 MIKROE 的 6 针针式线缆设计的 SWD 焊盘,提供可选的闪存和调试 SWD(串行线调试)接口功能。此 Click board™ 只能在 3.3V 逻辑电压下运行。使用不同逻辑电平的 MCU 之前,必须进行适当的逻辑电压电平转换。此外,该 Click board™ 附带一个包含易于使用的函数和示例代码的库,可用作进一步开发的参考。

LR 15 Click hardware overview image

功能概述

开发板

Curiosity PIC32 MZ EF 开发板是一个完全集成的 32 位开发平台,特点是高性能的 PIC32MZ EF 系列(PIC32MZ2048EFM),该系列具有 2MB Flash、512KB RAM、集成的浮点单元(FPU)、加密加速器和出色的连接选项。它包括一个集成的程序员和调试器,无需额外硬件。用户可以通过 MIKROE 

mikroBUS™ Click™ 适配器板扩展功能,通过 Microchip PHY 女儿板添加以太网连接功能,使用 Microchip 扩展板添加 WiFi 连接能力,并通过 Microchip 音频女儿板添加音频输入和输出功能。这些板完全集成到 PIC32 强大的软件框架 MPLAB Harmony 中,该框架提供了一个灵活且模块化的接口

来应用开发、一套丰富的互操作软件堆栈(TCP-IP、USB)和易于使用的功能。Curiosity PIC32 MZ EF 开发板提供了扩展能力,使其成为连接性、物联网和通用应用中快速原型设计的绝佳选择。

Curiosity PIC32MZ EF double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

PIC32

MCU 内存 (KB)

2048

硅供应商

Microchip

引脚数

100

RAM (字节)

524288

你完善了我!

配件

ISM 868/915MHz Active FPC Antenna (W3312B0100) 是来自 Pulse Electronics 的一款强大多频段活性平面贴片天线,非常适合用于 LPWA 应用。这款紧凑且高效的平面贴片天线专为 868MHz 和 915MHz 频段设计,具有典型的 0.8dBi 增益和 75x15mm 的尺寸。其标称阻抗为 50Ω,能够与您的现有系统无缝集成。天线使用的 FPC 材料确保了其耐用性和可靠性,而 2W 的功率额定值则确保了持续且可靠的性能。它配有一个 100mm OD 同轴电缆和 U.FL 连接器,实现了无缝连接。此外,W3312B0100 天线通过其 0.1mm 的柔性 PCB 厚度和背面的粘合胶带提供了便捷且安全的安装选项。无论是用于 LoRaWAN®、Sigfox®、WiFi HaLow™,还是其他 ISM 和远程控制应用,这款天线都提供了可靠的性能和多功能性。它适用于各种行业,包括 M2M、物联网、计量和工业自动化,成为了广泛应用的理想选择。

LR 15 Click accessories 1 image

6-pin Needle Cable 是一款紧凑型编程电缆,由高质量材料制成,耐用且便于携带,其小型方形设计与 0805 电阻相似。该电缆专为快速编程和调试而设计,配备 6 针 0.1″ 间距的扁平带状连接器,可手持操作或临时固定,是快速可靠的调试工具。

LR 15 Click accessories 2 image

使用的MCU引脚

mikroBUS™映射器

NC
NC
AN
Reset
RA9
RST
ID COMM
RPD4
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Boot Mode Control
RPE8
PWM
NC
NC
INT
UART TX
RPD10
TX
UART RX
RPD15
RX
I2C Clock
RPA14
SCL
I2C Data
RPA15
SDA
NC
NC
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

LR 15 Click Schematic schematic

一步一步来

项目组装

Curiosity PIC32MZ EF front image hardware assembly

从选择您的开发板和Click板™开始。以Curiosity PIC32 MZ EF作为您的开发板开始。

Curiosity PIC32MZ EF front image hardware assembly
GNSS2 Click front image hardware assembly
Prog-cut hardware assembly
GNSS2 Click complete accessories setup image hardware assembly
Curiosity PIC32 MZ EF MB 1 Access - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
Curiosity PIC32 MZ EF MCU Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

实时跟踪您的结果

应用程序输出

1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持

库描述

LR 15 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。

示例描述
本示例演示了使用 LR 15 Click 板的通信功能,通过将两块 Click 板配置为测试模式,展示它们之间的通信过程。

关键功能:

  • lr15_cfg_setup - 配置对象初始化函数。

  • lr15_init - 初始化函数。

  • lr15_reset_device - 通过切换复位引脚的逻辑状态重置设备。

  • lr15_cmd_run - 向 Click 模块发送指定命令的函数。

  • lr15_cmd_set - 为 Click 模块的指定命令设置值的函数。

应用初始化
初始化驱动程序和日志器。

应用任务
应用任务分为几个阶段:

  • LR15_POWER_UP: 启动设备,执行设备出厂重置,并读取系统信息。

  • LR15_CONFIG_EXAMPLE: 配置设备为 LoRa P2P 网络模式。

  • LR15_EXAMPLE: 通过与另一块 LR 14 Click 板交换消息,执行 LoRa P2P 测试示例。

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * @file main.c
 * @brief LR 15 Click Example.
 *
 * # Description
 * This example demonstrates the use of LR 15 Click board by showing
 * the communication between two Click boards configured in TEST 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:
 *  - LR15_POWER_UP:
 * Powers up the device, performs a device factory reset and reads system information.
 *  - LR15_CONFIG_EXAMPLE:
 * Configures device for the LoRa P2P network mode.
 *  - LR15_EXAMPLE:
 * Performs a LoRa P2P test example by exchanging messages with another LR 15 Click board.
 *
 * ## Additional Function
 * - static void lr15_clear_app_buf ( void )
 * - static void lr15_log_app_buf ( void )
 * - static err_t lr15_process ( lr15_t *ctx )
 * - static err_t lr15_read_response ( lr15_t *ctx, uint8_t *rsp, uint32_t timeout )
 * - static err_t lr15_power_up ( lr15_t *ctx )
 * - static err_t lr15_config_example ( lr15_t *ctx )
 * - static err_t lr15_example ( lr15_t *ctx )
 *
 * @author Stefan Filipovic
 *
 */

#include "board.h"
#include "log.h"
#include "lr15.h"
#include "conversions.h"
#include "generic_pointer.h"

#define DEMO_TEXT_MESSAGE   "MIKROE - LR 15 Click board"

static lr15_t lr15;
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
{
    LR15_POWER_UP = 1,
    LR15_CONFIG_EXAMPLE,
    LR15_EXAMPLE

} lr15_app_state_t;

static lr15_app_state_t app_state = LR15_POWER_UP;

/**
 * @brief LR 15 clearing application buffer.
 * @details This function clears memory of application buffer and reset its length.
 * @note None.
 */
static void lr15_clear_app_buf ( void );

/**
 * @brief LR 15 log application buffer.
 * @details This function logs data from application buffer to USB UART.
 * @note None.
 */
static void lr15_log_app_buf ( void );

/**
 * @brief LR 15 data reading function.
 * @details This function reads data from device and concatenates data to application buffer. 
 * @param[in] ctx : Click context object.
 * See #lr15_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 lr15_process ( lr15_t *ctx );

/**
 * @brief LR 15 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 #lr15_t object definition for detailed explanation.
 * @param[in] rsp : Expected response.
 * @param[in] timeout : Response timeout in milliseconds.
 * @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 lr15_read_response ( lr15_t *ctx, uint8_t *rsp, uint32_t timeout );

/**
 * @brief LR 15 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 #lr15_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 lr15_power_up ( lr15_t *ctx );

/**
 * @brief LR 15 config example function.
 * @details This function configures device for LoRa P2P example.
 * @param[in] ctx : Click context object.
 * See #lr15_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 lr15_config_example ( lr15_t *ctx );

/**
 * @brief LR 15 example function.
 * @details This function performs a LoRa P2P test example by exchanging messages
 * with another LR 15 Click board.
 * @param[in] ctx : Click context object.
 * See #lr15_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 lr15_example ( lr15_t *ctx );

void application_init ( void ) 
{
    log_cfg_t log_cfg;  /**< Logger config object. */
    lr15_cfg_t lr15_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.
    lr15_cfg_setup( &lr15_cfg );
    LR15_MAP_MIKROBUS( lr15_cfg, MIKROBUS_1 );
    if ( UART_ERROR == lr15_init( &lr15, &lr15_cfg ) ) 
    {
        log_error( &logger, " Communication init." );
        for ( ; ; );
    }

    log_info( &logger, " Application Task " );

    app_state = LR15_POWER_UP;
    log_printf( &logger, ">>> APP STATE - POWER UP <<<\r\n\n" );
}

void application_task ( void ) 
{
    switch ( app_state )
    {
        case LR15_POWER_UP:
        {
            if ( LR15_OK == lr15_power_up( &lr15 ) )
            {
                app_state = LR15_CONFIG_EXAMPLE;
                log_printf( &logger, ">>> APP STATE - CONFIG EXAMPLE <<<\r\n\n" );
            }
            break;
        }
        case LR15_CONFIG_EXAMPLE:
        {
            if ( LR15_OK == lr15_config_example( &lr15 ) )
            {
                app_state = LR15_EXAMPLE;
                log_printf( &logger, ">>> APP STATE - EXAMPLE <<<\r\n\n" );
            }
            break;
        }
        case LR15_EXAMPLE:
        {
            lr15_example( &lr15 );
            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 lr15_clear_app_buf ( void ) 
{
    memset( app_buf, 0, app_buf_len );
    app_buf_len = 0;
}

static void lr15_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 lr15_process ( lr15_t *ctx ) 
{
    uint8_t rx_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
    int32_t overflow_bytes = 0;
    int32_t rx_cnt = 0;
    int32_t rx_size = lr15_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 LR15_OK;
    }
    return LR15_ERROR;
}

static err_t lr15_read_response ( lr15_t *ctx, uint8_t *rsp, uint32_t timeout ) 
{
    uint32_t timeout_cnt = 0;
    lr15_clear_app_buf ( );
    lr15_process( ctx );
    while ( ( 0 == strstr( app_buf, rsp ) ) &&
            ( 0 == strstr( app_buf, LR15_RSP_ERROR ) ) )
    {
        lr15_process( ctx );
        if ( timeout_cnt++ > timeout )
        {
            lr15_log_app_buf( );
            log_error( &logger, " Timeout!" );
            return LR15_ERROR_TIMEOUT;
        }
        Delay_ms( 1 );
    }
    Delay_ms ( 200 );
    lr15_process( ctx );
    lr15_log_app_buf( );
    if ( strstr( app_buf, LR15_RSP_ERROR ) )
    {
        log_error( &logger, " CMD!" );
        return LR15_ERROR_CMD;
    }
    log_printf( &logger, "--------------------------------\r\n" );
    return LR15_OK;
}

static err_t lr15_power_up ( lr15_t *ctx )
{
    err_t error_flag = LR15_OK;
    
    log_printf( &logger, ">>> Reset device.\r\n" );
    lr15_reset_device( &lr15 );
    while ( LR15_OK == lr15_process( ctx ) )
    {
        lr15_log_app_buf( );
        lr15_clear_app_buf ( );
    }
    log_printf( &logger, "--------------------------------\r\n" );

    log_printf( &logger, ">>> Check communication.\r\n" );
    lr15_cmd_run( &lr15, LR15_CMD_AT );
    error_flag |= lr15_read_response( &lr15, LR15_RSP_AT, LR15_RSP_TIMEOUT_DEFAULT );

    log_printf( &logger, ">>> Factory reset.\r\n" );
    lr15_cmd_run( &lr15, LR15_CMD_FDEFAULT );
    error_flag |= lr15_read_response( &lr15, LR15_RSP_FDEFAULT, LR15_RSP_TIMEOUT_DEFAULT );

    log_printf( &logger, ">>> Get device firmware version.\r\n" );
    lr15_cmd_get( ctx, LR15_CMD_VER );
    error_flag |= lr15_read_response( ctx, LR15_RSP_VER, LR15_RSP_TIMEOUT_DEFAULT );

    log_printf( &logger, ">>> Get module ID.\r\n" );
    lr15_cmd_get( ctx, LR15_CMD_ID );
    error_flag |= lr15_read_response( ctx, LR15_RSP_ID, LR15_RSP_TIMEOUT_DEFAULT );

    return error_flag;
}

static err_t lr15_config_example ( lr15_t *ctx )
{
    err_t error_flag = LR15_OK;

    log_printf( &logger, ">>> Enter TEST mode.\r\n" );
    lr15_cmd_set( ctx, LR15_CMD_MODE, LR15_PARAM_MODE_TEST );
    error_flag |= lr15_read_response( ctx, LR15_RSP_MODE, LR15_RSP_TIMEOUT_DEFAULT );

    log_printf( &logger, ">>> Check test mode and RF configuration.\r\n" );
    lr15_cmd_get( ctx, LR15_CMD_TEST );
    error_flag |= lr15_read_response( ctx, LR15_RSP_TEST_RFCFG, LR15_RSP_TIMEOUT_DEFAULT );
    
    // Default RF configuration: FREQUENCY, SF, BANDWIDTH, TX PR, RX PR, TX POWER, CRC, IQ, NET
    #define RF_CFG_DEFAULT "868, SF7, 125, 8, 8, 14, ON, OFF, OFF"
    log_printf( &logger, ">>> Set RF configuration.\r\n" );
    lr15_cmd_param_set( ctx, LR15_CMD_TEST, LR15_PARAM_TEST_RFCFG, RF_CFG_DEFAULT );
    error_flag |= lr15_read_response( ctx, LR15_RSP_TEST_RFCFG, LR15_RSP_TIMEOUT_DEFAULT );

    return error_flag;
}

static err_t lr15_example ( lr15_t *ctx )
{
    err_t error_flag = LR15_OK;
    uint8_t msg_hex[ 201 ] = { 0 };
    uint8_t byte_hex[ 3 ] = { 0 };
    uint8_t len[ 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 < 100 ); cnt++ ) 
    {
        uint8_to_hex ( DEMO_TEXT_MESSAGE[ cnt ], byte_hex );
        strcat ( msg_hex, byte_hex );
    }
    log_printf( &logger, ">>> Send message: \"%s\".\r\n", ( char * ) DEMO_TEXT_MESSAGE );
    lr15_cmd_param_set( ctx, LR15_CMD_TEST, LR15_PARAM_TEST_TXLRPKT, msg_hex );
    error_flag |= lr15_read_response( ctx, LR15_RSP_TEST_TX_DONE, LR15_RSP_TIMEOUT_DEFAULT );
    
    if ( LR15_OK == error_flag )
    {
        memset( msg_hex, 0, sizeof ( msg_hex ) );
        #define RX_MODE_TIMEOUT 30000
        log_printf( &logger, ">>> Go to RX mode (timeout: 30s).\r\n" );
        lr15_cmd_param_get( ctx, LR15_CMD_TEST, LR15_PARAM_TEST_RXLRPKT );
        error_flag |= lr15_read_response( ctx, LR15_RSP_TEST_RX, RX_MODE_TIMEOUT );
    }
    
    if ( LR15_OK == error_flag )
    {
        uint8_t * __generic_ptr start_ptr = strstr( app_buf, LR15_RSP_TEST_RXLEN );
        uint8_t * __generic_ptr end_ptr = NULL;
        if ( start_ptr )
        {
            start_ptr = start_ptr + strlen ( LR15_RSP_TEST_RXLEN );
            end_ptr = strstr ( start_ptr, "," );
            memcpy ( len, 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, "\r\n" );
            memcpy ( snr, start_ptr, end_ptr - start_ptr );

            start_ptr = strstr ( end_ptr, "\"" ) + 1;
            end_ptr = strstr ( start_ptr, "\"" );
            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, " Message: %s\r\n", msg_hex );
            log_printf ( &logger, " LEN: %s\r\n", len );
            log_printf ( &logger, " RSSI: %s\r\n", rssi );
            log_printf ( &logger, " SNR: %s\r\n", snr );
            log_printf( &logger, "--------------------------------\r\n" );
        }
    }

    Delay_ms ( 1000 );

    return error_flag;
}

// ------------------------------------------------------------------------ END

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。