1. 添加AT Device软件包 启用ChinaMobile M5311模块

2. 在OneNet软件包中修改自己的相关信息

3. 确定引脚
M5311工作在串口2上,在STM32F407ZGT6中为PA2和PA3,注意TX与RX引脚反接的问题。

4. 在board.h中加入如下代码

5. 添加两个头文件

6. 使用配置连接



两个位置:
{你建立工程下}rt-thread\components\drivers\include\drivers
{你建立工程下}rt-thread\components\drivers\include\ipc
7. 在rtconfig.h中确认产品信息是否正确

8. 上传线程代码部分问题

此处delay200,会导致执行onenet_mqtt_upload_string()时M5311与云平台还未建立连接,导致数据无法上传成功,执行break语句跳出循环,导致云平台没有数据流。
最终报错:

9. 解决方法:
将延时函数放在循环外执行,增加延时时间,等待M5311与云平台建立连接之后进入循环,再从消息队列中取数据上传。
//数据上传线程的入口函数
staticvoidonenet_upload_entry(void*parameter)
{
charupload_buf[16] = {0};
uint8_t r1_queue;
rt_err_tuwRet=RT_EOK;
// 接收信号量
if(rt_sem_take(mqttinit_sem,RT_WAITING_FOREVER)==RT_EOK)
{
rt_sem_delete(mqttinit_sem);
}
rt_thread_delay(30000); // 需要等待NB-IoT连接成功,否则数据上传失败,直接跳出程序
while (1)
{
// t1_mq 队列读取(接收),等待时间为一直等待 , 返回RT_EOK成功;-RT_ETIMEOUT超时;-RT_ERROR失败
uwRet=rt_mq_recv(t1_mq, // 消息队列对象句柄
&r1_queue, // 消息内容
sizeof(r1_queue), // 消息大小
RT_WAITING_FOREVER); // 指定超时时间
if(RT_EOK==uwRet) // 接收成功,打印接收值
{
rt_kprintf("Received content:%d\n",r1_queue);
}
else // 接收失败,打印错误码
{
rt_kprintf("Data reception error, error code: 0x%lx\n",uwRet);
}
rt_sprintf(upload_buf, "%3d.%2dC",r1_queue/10,r1_queue%10); // 控制要显示小数值
// 按照格式把数据 r1_queue/10,r1_queue%10 保存到 数组UPLOAD_BUF中,以便上传到ONENET
if (onenet_mqtt_upload_string("temperature2022",upload_buf) <0) //调用onenet_mqtt_upload_string函数上传数据
{
LOG_E("upload has an error, stop uploading");
break;
}
else
{
LOG_D("buffer : {\"temperature\":%s}", upload_buf);
}
}
}
10. 为什么要将延时函数放在循环之外
需要长延时来等待M5311与云平台建立连接,如果延时函数放在循环之内则每次从消息队列中取数据都需要经历一段长延时。
而在经历长延时的过程当中ds18b20线程会不断地往消息队列中发送数据在消息队列中排队,造成数据上传线程取数据慢,ds18b20线程传数据快。所以数据上传线程从消息队列中取到的数据可能是ds18b20很久之前放进去的数据,且运行时间越长,数据实时性越差。
所以将延时函数放在循环之外,只进行一次延时用于等待M5311建立连接。