#include "nbiot.h"
#include "string.h"
#include "stdlib.h"
#include "led.h"
#include "beep.h" /*********************************************************************************
*********************启明欣欣 STM32F407应用开发板(高配版)*************************
**********************************************************************************
*资源源于网络 代码由阿正修改
*QQ群:476840321
* *
**********************************************************************************
*********************************************************************************/ u8 receive_str6[USART6_REC_NUM]; //接收缓存数组,最大USART_REC_LEN个字节
u8 uart_byte_count6=;
//定义结构体用来存储接收数据
typedef struct {
char USART_BUFF[];
int USART_Length;
int flag;
}Usart_Struct; Usart_Struct struct_usart6;
/****************************************************************************
* 名 称: void uart1_init(u32 bound)
* 功 能:USART6初始化
* 入口参数:bound:波特率
* 返回参数:无
* 说 明:
****************************************************************************/
void uart6_init(u32 bound)
{ //GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);//使能USART1时钟
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6); //GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6); //GPIOA10复用为USART1
//USART1端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PA9,PA10
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART6, &USART_InitStructure); //初始化串口1
USART_Cmd(USART6, ENABLE); //使能串口1 USART_ClearFlag(USART6, USART_FLAG_TC); USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); //开启相关中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
} /*******************************************************************************
* 发送字节
*******************************************************************************/
void uart6_send_char(u8 temp)
{
USART_SendData(USART6,(u8)temp);
while(USART_GetFlagStatus(USART6,USART_FLAG_TXE)==RESET);
} /*******************************************************************************
* 发送字符串
*******************************************************************************/
void uart6_send_buff(u8 buf[],u32 len)
{
u32 i;
for(i=;i<len;i++)
uart6_send_char(buf[i]);
// 可设置换行符 NB串口AT指令不需要换行
// uart2_send_char('\r');
// uart2_send_char('\n'); }
void USART6_IRQHandler(void)
{
uint8_t ch;
#ifdef SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART6,USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART6,USART_IT_RXNE);
ch = USART_ReceiveData(USART6);
struct_usart6.USART_BUFF[struct_usart6.USART_Length++] = ch;
struct_usart6.flag = ;
}
if( USART_GetITStatus( USART6, USART_IT_IDLE ) == SET )
{
USART_ClearITPendingBit(USART6,USART_IT_IDLE);
struct_usart6.flag = ;
ch = USART_ReceiveData(USART6);
}
#ifdef SYSTEM_SUPPORT_OS
OSIntExit();
#endif } /*******************************************************************************
* 发送字符串 并解析返回值是否正确
* cmd为传入值 reply 为校验返回值 wait 为延时
*******************************************************************************/
int NBiot_SendCmd(char* cmd, char* reply, int wait)
{
struct_usart6.USART_Length = ;
printf("[NBiot_SendCmd] %s\r\n", cmd); uart6_send_buff((u8*)cmd, strlen(cmd)); delay_ms(wait); if (strcmp(reply, "") == ) //返回值为空
{
return ;
} if (struct_usart6.USART_Length != ) //返回值不为空
{
struct_usart6.USART_BUFF[struct_usart6.USART_Length] = '\0'; if (strstr((char*)struct_usart6.USART_BUFF, reply))
{
printf("\r\n%s+++YES\r\n", struct_usart6.USART_BUFF); return ;
}
else if (strstr((char*)struct_usart6.USART_BUFF, "ERROR"))
{
printf("ERROR...\r\n"); delay_ms(); return ;
}
else
{
printf("\r\n%s+++NO\r\n", struct_usart6.USART_BUFF); return ;
}
}
}
int NBiot_Init()
{
int ret = ;
ret = NBiot_SendCmd("admin#AT+VER","OK", ); //询问版本号作为初始化
if (!ret)
{
printf("Cannot initialize NBIOT module");
return ;
}
return ret;
}

STM32&AT指令NBIOT模组的更多相关文章

  1. 利尔达NB-IOT模组Coap数据AT+NMGS发送时返回-513的原因

    1. 利尔达NB-IOT模组使用AT+NMGS发送数据,返回-513的问题,大致有3种可能性,在硬件上,模组的射频电路分为A型和B型模组,所以烧写固件的时候,也要分为A和B型固件,如果烧写反了,那么R ...

  2. NB-IOT模组指令AT+NMSTATUS和AT+CGPADDR对比

    1. AT+NMSTATUS,这个指令是用来查询模块在IOT平台的注册情况.注册指的是lwm2m协议里面的注册机制,详细可以参考lwm2m协议. 2. AT+MREGSWT,设置重启之后,自动启动注册 ...

  3. 海思NB-IOT模组在平台上注册

    1. 添加设备,网页测试平台 https://develop.ct10649.com:8093/#/applications/1_lq7clNExjnGvPvGMG8w7_oYn4a/products ...

  4. 最全的NB-IoT芯片厂商、模组厂商信息

    NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...

  5. [原创]移远RM500U-CN模组驱动移植

    1. 简介 中国广电正式放号了,为了支持广电700MHz的5G基站,需要换用新的5G模组.移远通信的RM500U模组正好可以满足我们的使用要求; 我们选用该模组的原因:双卡单待 支持SIM卡热插拔 支 ...

  6. NFC模组,开发NFC功能 仅仅要几条指令的事情

    特点:实现NFC透明传输.内置NFC协议栈,支持UART串口直接读写,用于门禁能够同一时候兼容手机和卡片开门,还能实现动态密钥,读到的NFC数据自己主动串口输出,会串口就能开发NFC,不须要研究LLC ...

  7. 中国移动推出NB-IoT/eMTC/GSM多模通信模组Qualcomm调制解调器支持

    亚洲电子消费展(CES Asia)在上海举行.期间,中国移动正式推出NB-IoT/eMTC/GSM三模通信模组A9500.该通信模组采用Qualcomm MDM9206 LTE IoT调制解调器,具有 ...

  8. 摄像头模组 PDAF对焦(Phase Detection Auto Focus)

    本文主要是最近看的两个文档的总结,相对零散的笔记,包括<imx298 software reference PDAF>与<PDAF Truly>. 1.PDAF功能的实现需要使 ...

  9. 第五部分 linux系统管理员 开机流程 模组管理 与loader

    第五部分   linux系统管理员  开机流程  模组管理  与loader   开机流程分析 cmos保存电脑硬件的参数 bios 基本的输入输出系统  读取硬件的软件 MBR  master bo ...

随机推荐

  1. FZU1901 Period II —— KMP next数组

    题目链接:https://vjudge.net/problem/FZU-1901  Problem 1901 Period II Accept: 575    Submit: 1495Time Lim ...

  2. 域名ip自动跳转 跳转指定页面的js

    域名ip自动跳转 跳转指定页面的js 为了应对百度审核,需要客户的网站在个别地区跳转到另一个页面,就搞到了这段代码,屡试不爽,超实用.下面把地址换成你要访问的网站url地址或者文件url地址即可.超实 ...

  3. function.py

    #文档字符串 def square(x): 'calculates the square of the number x' return x*x square.__doc__ help(square) ...

  4. jmeter+jenkins+ant部署持续集成测试

    原文地址:http://blog.csdn.net/kaluman/article/details/74535495 开头的注意事项: 1.所有的环境变量和代码,都需要使用英文的符号,变量之间都需要英 ...

  5. 如何在XCode中更改iPhone或iPad模拟器类型

    如何在XCode中更改iPhone或iPad模拟器类型 参考方法一(永久,一旦设置后,每次运行指定的模拟器):(1)选择顶层菜单Project 中的 Set Active Executable(2)根 ...

  6. E20170426-gg

    recursive   adj. 回归的,递归的; removal    n. 除去; 搬迁; 免职; 移走; customize vt. 定制,定做; 按规格改制;

  7. C++经典面试题全集 50~100道 都附带有参考答案

    51.  引用与指针有什么区别? 答 .1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象. 3) 不存在指向空值的引用,但是存在指向空值的指针. 52.  描 ...

  8. IT兄弟连 JavaWeb教程 Servlet API

    Java Servlet是运行在带有支持Java Servlet规范的解释器的web服务器上的Java类. Servlet可以使用javax.servlet和javax.servlet.http包创建 ...

  9. 笔记:重新认识CSS3

    1.CSS3边框 border-radius box-shadow border-image 2.CSS3背景 background-image background-size background- ...

  10. Redis生成主键ID

    使用Redis來生成主鍵ID策略,這裡主要使用 RedisAtomicLong 類來實現主鍵生成策略.具體代碼如下: /** * @Description: 获取自增长值 * @param key k ...