1、连线
一般来说只需要将NB模块的串口线对应连接单片机的串口即可。
具体连线方式为模块的VCC,GND分别连接单片机的5V和GND,模块的TXD连接单片机的PB10,RXD连接PB11.。即通过串口三与nb模块通信
2、代码
串口三的配置代码这里不详细说,都是仿照串口1的代码抄写过来的。需要的直接下载工程文件即可。
下面看看核心代码:
void NBIOT_test(void)
{
// char wbuf[10];
while(NBIOT_send_cmd("AT","OK\r\n",20))//检查WIFI模块是否在线
printf("%s\r\n", "AT指令测试正常"); //
while(NBIOT_send_cmd("AT+CSQ", "OK\r\n", 20));
printf("%s\r\n", "模块信号测试正常"); //点亮指示灯
while (NBIOT_send_cmd("AT+CGATT?", "+CGATT:1\r\n\r\nOK\r\n", 20));
printf("%s\r\n", "模块入网测试正常"); //点亮指示灯
while (NBIOT_send_cmd("AT+NCDP=49.4.85.232,5683", "OK\r\n", 20));
printf("%s\r\n", "模块连接云平台正常"); //
while (NBIOT_send_cmd("AT+NCDP?", "+NCDP:49.4.85.232,5683\r\n\r\nOK\r\n", 20));
printf("%s\r\n", "模块连接云平台测试正常"); //
while (NBIOT_send_cmd("AT+NNMI=1", "OK\r\n", 20));
printf("%s\r\n", "模块接收消息开启"); //
// snprintf(wbuf, 1024, "%s%d,%d","AT+NMGS=",1,12);
// printf("%s\r\n", wbuf); //
// while (NBIOT_send_cmd((char*)wbuf,"OK\r\n", 20));//用这三句话程序会死掉
u3_printf("%s%d,%02X%02X%02X%02X%02X%02X%02X\r\n","AT+NMGS=",7,1,1,1,1,1,1,1);//发送指令后面必须要有换行
// if(NBIOT_check_cmd("OK\r\n"))
// {
printf("%s\r\n", "模块发送消息成功"); //
// }
// NBIOT_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑
memset(USART3_RX_BUF,0,USART3_MAX_RECV_LEN);
USART3_RX_STA=0;
}
这里都写有直接的说明了,这里不再累赘重复。
下面看看接收的核心代码响应接收的核心函数:
void NBIOT_response(u8 mode)
{
int i;
if((USART3_RX_STA&0X8000)) //接收到一次数据了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
printf("串口3接收到的原始数据是%s\r\n",USART3_RX_BUF); //发送到串口
res = (char*)USART3_RX_BUF;
// if(set_ok == 0)//还没锁死之前可以修改数据
// if(send_ok == 0)//还没锁死之前可以修改数据
// {
if (strstr((char*)res, "+NNMI:") !=NULL) //是否包含回传数据
{
printf("NB模块接收云平台数据是%s",res); //发送到串口
sscanf(res,"\r\n+NNMI:%d,%s\r\n",&tem[0],str);
printf("长度是%d,第一位数据是%s",tem[0],str); //发送到串口
for(i=0;i<16;i++)
{
tem[i] = str[i]-48;
printf("%d\r\n",tem[i]);
}
if(send_ok == 0)//还没锁死之前可以修改数据
{
kind_flag = tem[3];
star_hour = tem[5]*10+tem[7];
star_min = tem[9]*10+tem[11];
}
sok = tem[15];
send_ok = 1;
}
if (strstr((char*)res, "+CCLK:") !=NULL) //是否包含回传数据
{
printf("当前网络的时间是%s",res); //发送到串口
sscanf(res,"\r\n+CCLK:%d/%d/%d,%d:%d:%d+%d\r\n", &time[0], &time[1], &time[2],&time[3],&time[4],&time[5],&time[6]);
if(time[3]+8 >= 24)//转化时间
{
time[3]=time[3]+8-24;
}
DS3231_Set(time[0],time[1],time[2],time[3]+8,time[4],30); //首次设置时间,设置完成后注释掉,重新下载一次程序即可掉电保存年,月,日,时,分,秒
printf("现在当前的时间是:%d:%d\r\n",time[3],time[4]); //发送到串口
}
if (strstr((char*)res, "+CSQ") !=NULL) //是否包含回传数据
{
printf("当前的信号是%s",res); //发送到串口
sscanf(res,"\r\n+CSQ:%d,%d\r\n", &time[7],&time[8]);
csq=time[7];
printf("现在当前的信号是:%d\r\n",csq); //发送到串口
}
// }
if(mode)//把数组缓存清零
{
memset(USART3_RX_BUF,0,USART3_MAX_RECV_LEN);
USART3_RX_STA=0;
}
}
}
这些是取出数据的代码,就是取出对应的数据代码。
下面看看发送的代码,发送的代码就是直接将数据通过串口三发送出去即可。
u3_printf("%s%d,%02X%02X%02X%02X%02X%02X%02X\r\n","AT+NMGS=",7,temperature/10,kind_flag,0,star_hour,star_min,star,csq);//发送指令后面必须要有换行
printf("%s\r\n", "模块发送消息成功"); //
我这里通过一个定时器将数据发送。
说多了也无意义,我直接将我的代码直接分享出来就好了。想要的直接拿来用即可。不过需要注意的是你要在云平台上面设置对应的插件才可以在云平台上面接收到对应的参数,否则是无法接收的,因为参数无法对应的问题。微信公众号一手创客回复06即可获得整个程序的文件。或者蓝凑云链接:
https://wwa.lanzouq.com/b015ipphc
密码:df61
下一章我将我的云平台的插件内容展示出来。