Uaena.454 2024-02-23 16:23 采纳率: 16.7%
浏览 129
已结题

rtthread 移远4g


#include <rtthread.h>
#include <board.h>
#include <string.h>
#include <rtdevice.h>
#include <at.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <zlib.h>

#define EC800M_UART_NAME    "uart5"  // 使用 UART5 与 EC800M 模块通信

// 定义接收缓冲区大小
#define RX_BUFFER_SIZE      256

rt_size_t size=RX_BUFFER_SIZE;

// 定义全局接收缓冲区
static char rx_buffer[RX_BUFFER_SIZE];


//给移远芯片发送指令
void send_ec800m_command(const char *command)
{
    rt_device_t serial = rt_device_find(EC800M_UART_NAME);
    rt_device_init(serial);
    if (serial == RT_NULL)
    {
        rt_kprintf("Serial device not found!\n"); //找不到
        return;
    }
    else
    rt_kprintf("Serial device %s found!\n",serial); //找到

    rt_err_t err= rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX|RT_DEVICE_FLAG_DMA_TX);
    if (err == RT_NULL)
        {
            rt_kprintf("Serial device not open!\n"); //找不到
            return;
        }
        else
        rt_kprintf("Serial device %s open!\n",serial); //找到

    // 发送指令
    rt_size_t select= rt_device_write(serial, 0, command, strlen(command)); //目标设备 起始位置,指令,长度
    if(select!=RT_NULL)
    {
        rt_kprintf("send %s command!\n",command);
        rt_kprintf("send at success\n");
    }
    else {
        rt_kprintf("failed\n");

    }

    // 等待一段时间,等待 EC800M 模块响应并处理响应数据


    rt_thread_mdelay(2000);
    rt_size_t mes =rt_device_read(serial, 0, rx_buffer, size);
    if(mes!=RT_NULL)
        {
            rt_kprintf("Received data: %s\n", rx_buffer);
            rt_kprintf("Receive message successful\n");
        }
        else {
            rt_kprintf("Received data: %s\n", rx_buffer);
            rt_kprintf("failed receive\n");

        }

    rt_thread_mdelay(2000);
    rt_kprintf("1111\n");



    rt_kprintf("wait\n");
}
void ec800m_task(void *parameter)
{
    // 发送 AT 指令查询设备信息
    send_ec800m_command("AT\r\n");
    send_ec800m_command("AT\n");
    send_ec800m_command("AT+cops? \n");


}

int ec800m_init(void)
{
    // 创建一个线程用于与 EC800M 模块通信
    rt_thread_t thread = rt_thread_create("ec800m_task", ec800m_task, RT_NULL, 1024, 25, 10);
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
        rt_kprintf("Successful\n");
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}

int main(void)
{

    ec800m_init();

    return RT_EOK;
}

img


用stm32f413和EC800M成功发送了AT指令,但接收不到返回信息

  • 写回答

8条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-23 16:24
    关注

    引自免费微信小程序:皆我百晓生

    代码分析:

    这段代码是基于 RT-Thread 实时操作系统(RTOS)的环境,用于通过 UART 与移远 EC800M 4G 模块进行通信。EC800M 是一款工业级 4G 无线通信模块,常用于物联网应用中提供无线数据传输功能。

    首先,程序初始化了几个宏定义和全局变量:

    1. EC800M_UART_NAME 定义了与 EC800M 模块通信所使用的 UART 设备名称为 "uart5"。
    2. RX_BUFFER_SIZE 定义了接收缓冲区大小为 256 字节。
    3. rx_buffer 是一个全局字符数组,用于存储从 EC800M 模块接收到的数据。

    接下来,send_ec800m_command 函数实现了向 EC800M 发送 AT 命令的功能,并读取响应数据:

    • 首先,函数查找名为 "uart5" 的 UART 设备并初始化它。
    • 然后打开 UART 设备,设置标志为支持 DMA 接收和发送。
    • 使用 rt_device_write 向 EC800M 发送指定的 AT 命令。
    • 发送命令后延时等待 EC800M 响应,然后使用 rt_device_read 读取响应到接收缓冲区 rx_buffer 中。
    • 如果读取成功,则打印接收到的数据;否则,打印失败信息。

    ec800m_task 函数中,创建了一个线程,该线程连续发送三个不同的 AT 命令以查询 EC800M 模块的状态信息:

    1. "AT\r\n" - 测试基本的 AT 命令响应。
    2. "AT\n" - 类似于上一条命令,但换行符不同,用于兼容性测试。
    3. "AT+cops?\n" - 查询当前网络运营商的信息。

    最后,在 main 函数中调用 ec800m_init 函数来初始化并启动 ec800m_task 线程。

    根据您提供的日志输出:

    ...
    Serial device uart5 found!
    Serial device uart5 open!
    send AT command!
    send at success
    Received data :
    failed receive
    ...
    

    日志显示 UART 设备已成功找到并打开,AT 命令也成功发送出去,但是没有接收到有效的响应数据。这可能是因为:

    1. EC800M 模块未正确配置或未能正常工作。
    2. UART 参数设置不正确,如波特率、数据位、停止位、校验位等与 EC800M 模块实际配置不符。
    3. 延迟时间可能不足以让 EC800M 模块完成响应,需要调整延迟时间或者采用异步事件驱动的方式处理串口数据接收。

    要解决这个问题,您可以检查以下几个方面:

    • 确保 EC800M 模块已经开机并且处于正常工作状态。
    • 核实 UART 配置参数是否与 EC800M 模块手册中推荐的参数一致。
    • 调整等待响应的延时时间,确保 EC800M 有足够的时间来生成和发送响应数据。
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月23日
  • 创建了问题 2月23日