国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32驅動SIM900A短信模塊

這篇具有很好參考價值的文章主要介紹了STM32驅動SIM900A短信模塊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介:STM32F103C8T6驅動SIM900A短信模塊源碼介紹。

開發(fā)平臺:KEIL ARM

MCU型號:STM32F103C8T6

傳感器型號:SIM900A

特別提示:驅動內可能使用了某些其他組件,比如delay等,在文末外設模板下載地址內有。

1積分源碼下載地址在文末!??!

接口圖:

STM32驅動SIM900A短信模塊

使用舉例:

#include <stdio.h>
#include "GSM_func.h"

int main()
{
	char mes[] = "this is message";
	uint8_t recMesID = 0;
	GSM_Init(); // 初始化
	GSM_sendMessage(mes);
	while(1) {
		// 接收到短信send:1
		if((recMesID = GSM_waitMessage()) != 0) {
			char val = GSM_readMessage(recMesID); // val = 1
			printf("rec mes val:%c\n", val);
		}
	}
}

驅動源碼:

GSM_config.c

#include "main.h"


#if 0
#define  GSM_USARTx                   USART1
#define  GSM_USART_CLK                RCC_APB2Periph_USART1
#define  GSM_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  GSM_USART_BAUDRATE           9600

#define  GSM_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  GSM_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  GSM_USART_TX_GPIO_PORT       GPIOA   
#define  GSM_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  GSM_USART_RX_GPIO_PORT       GPIOA
#define  GSM_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  GSM_USART_IRQ                USART1_IRQn
#define  GSM_USART_IRQHandler         USART1_IRQHandler

#else
#define  GSM_USARTx                   USART2
#define  GSM_USART_CLK                RCC_APB1Periph_USART2
#define  GSM_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  GSM_USART_BAUDRATE           9600
                                        
#define  GSM_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  GSM_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
                                        
#define  GSM_USART_TX_GPIO_PORT       GPIOA   
#define  GSM_USART_TX_GPIO_PIN        GPIO_Pin_2
#define  GSM_USART_RX_GPIO_PORT       GPIOA
#define  GSM_USART_RX_GPIO_PIN        GPIO_Pin_3
                                        
#define  GSM_USART_IRQ                USART2_IRQn
#define  GSM_USART_IRQHandler         USART2_IRQHandler
#endif

//	
char GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 				
char GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN]; 				

// [14:0]: 接收字節(jié)數(shù) [15]: 接收完成標志
volatile uint16_t GSM_USART_RX_STA = 0;   	

// GSM串口中斷處理
void GSM_USART_IRQHandler(void)
{
	uint8_t res;	      
	if(USART_GetITStatus(GSM_USARTx, USART_IT_RXNE) != RESET)
	{	 
		res = USART_ReceiveData(GSM_USARTx);
		if((GSM_USART_RX_STA&(1<<15))==0)
		{ 
			if(GSM_USART_RX_STA<GSM_USART_MAX_RECV_LEN)
			{
				TIM_SetCounter(TIM3,0);
				if(GSM_USART_RX_STA==0) 
				{
					TIM_Cmd(TIM3,ENABLE);
				}
				GSM_USART_RX_BUF[GSM_USART_RX_STA++]=res;	
			}else 
			{
				GSM_USART_RX_STA|=1<<15;
			} 
		}
		USART_ClearITPendingBit(GSM_USARTx, USART_IT_RXNE);
	}  				 											 
}   
// TIM3中斷處理
void TIM3_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{	 			   
		GSM_USART_RX_STA|=1<<15;
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		TIM_Cmd(TIM3, DISABLE); 
	}	    
}
/**
  * @brief  GSM 10ms定時器初始化
  * @param  None
  * @retval None
  * @note   用于檢測GSM串口接收狀態(tài)
*/
void GSM_TIM3_Init(void)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	TIM_DeInit(TIM3);
	TIM_TimeBaseStructure.TIM_Period = 1000-1; 
	TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM3,DISABLE);

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
/**
  * @brief  GSM 串口初始化
  * @param  bound: 波特率
  * @retval None
  * @note   None
*/
void GSM_USART_Init(uint32_t bound)
{  
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	GSM_USART_GPIO_APBxClkCmd(GSM_USART_GPIO_CLK, ENABLE);
	GSM_USART_APBxClkCmd(GSM_USART_CLK,ENABLE);

 	USART_DeInit(GSM_USARTx); 
	//USART_TX
	GPIO_InitStructure.GPIO_Pin = GSM_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GSM_USART_TX_GPIO_PORT, &GPIO_InitStructure);
	//USART_RX
	GPIO_InitStructure.GPIO_Pin = GSM_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GSM_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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(GSM_USARTx, &USART_InitStructure);
	
	USART_Cmd(GSM_USARTx, ENABLE);
	USART_ITConfig(GSM_USARTx, USART_IT_RXNE, ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = GSM_USART_IRQ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	//
	
	GSM_USART_RX_STA=0;
}

GSM_config.h

#ifndef __GSM_CONFIG_H
#define __GSM_CONFIG_H	 

#include "main.h"

#define GSM_USART_MAX_RECV_LEN		128		//	接收緩存大小
#define GSM_USART_MAX_SEND_LEN		32		//  發(fā)送緩存大小
#define GSM_USART_RX_EN 			1		//  接收使能標志

#define  GSM_USARTx 				USART2

extern char  GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 
extern char  GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN];
extern volatile uint16_t GSM_USART_RX_STA; // 接收數(shù)據(jù)狀態(tài)

void GSM_USART_IRQHandler(void);
void TIM3_IRQHandler(void);
void GSM_TIM3_Init(void);
void GSM_USART_Init(uint32_t bound);

#endif

GSM_func.c

#include "main.h"
 C lib
//#include <stdlib.h>
//#include <string.h>
//#include <stdio.h>
 system
//#include "delay.h"
// GSM
#include "GSM_config.h"


static char* GSM_check_cmd(char *str);
static void GSM_sendData(char* fmt,...);

// GSM信息
const char* GSM_phoneNum = "19198022169";
const char* GSM_head = "send:";

/**
  * @brief  向GSM串口發(fā)送數(shù)據(jù)
  * @param  fmt: 類似printf的數(shù)據(jù)格式
  * @retval None
  * @note   None
  */
void GSM_sendData(char* fmt,...)  
{  
	uint16_t i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)GSM_USART_TX_BUF,fmt,ap);
	va_end(ap);
	i = strlen((const char*)GSM_USART_TX_BUF);		
	for(j=0; j<i; j++)						
	{
	  while(USART_GetFlagStatus(GSM_USARTx,USART_FLAG_TC)==RESET); 
		USART_SendData(GSM_USARTx,GSM_USART_TX_BUF[j]); 
	} 
}
/**
  * @brief  檢測應答
  * @param  str: 期待的應答結果
  * @retval 0: 沒有接收到期待應答
  * @retval !0: 其他值代表期待應答結果的位置
  * @note   None
  */
static char* GSM_check_cmd(char *str)
{
	char *strx=0;
	// 接收到一次數(shù)據(jù)了
	if(GSM_USART_RX_STA&0X8000)		
	{ 
		// 添加結束符
		GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
		// 檢索字符串
		strx=strstr(GSM_USART_RX_BUF,str);
		#ifdef DEBUG_printf
		printf("rec data: %s\n",GSM_USART_RX_BUF);
		#endif
	} 
	return strx;
}
/**
  * @brief  向GSM發(fā)送命令
  * @param  cmd: 發(fā)送的命令字符串
  * @param	ack: 期待的應答結果,如果為空,則表示不需要等待應答
  * @param	waittime: 等待時間(單位:10ms)
  * @retval 0: 發(fā)送成功(得到了期待的應答結果), 
  * @retval	1: 發(fā)送失敗
  * @note   None
  */
char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
{
	char res=0; 
	GSM_USART_RX_STA=0;
	//發(fā)送命令
	GSM_sendData("%s",cmd);	
	if(ack&&waittime)		//需要等待應答
	{
		while(--waittime)	//等待倒計時
		{
			DELAYClass.DelayMs(10);
			if(GSM_USART_RX_STA&0X8000)//接收到期待的應答結果
			{
				if(GSM_check_cmd(ack) != ((void *)0))
				{
					break; // 得到有效數(shù)據(jù) 
				}
				GSM_USART_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 
/**
  * @brief  string轉換int
  * @param  *str:字符串地址
  * @retval 返回int型
  * @note   None
  */
int stringToInt(char *str)
{
	char *p = str;
	int nNUM = 0;
	
	while (*p >= '0' && *p <= '9')
	{
		nNUM = nNUM * 10 + (*p - '0');
		p++;
	}
	return nNUM;
}
/**
  * @brief  發(fā)送短信
  * @param  None
  * @retval None
  */
void GSM_sendMessage(char *message)
{
	char p[40];

	#ifdef DEBUG_printf
	printf("0. AT+CPIN?\n");
	#endif
	while(GSM_send_cmd("AT+CPIN?\r\n","OK",100));		// 查詢卡狀態(tài)
	#ifdef DEBUG_printf
	printf("1. AT+CMGF=1\n");
	#endif
	while(GSM_send_cmd("AT+CMGF=1\r\n","OK",100));		// 設置TXT模式
	#ifdef DEBUG_printf
	printf("2. AT+CMGS=\n");
	#endif
	sprintf((char*)p,"AT+CMGS=\"%s\"\r\n",GSM_phoneNum); // 設置目標手機號
	while(GSM_send_cmd(p,">",100));  
	DELAYClass.DelayMs(50);
	#ifdef DEBUG_printf
	printf("3. %s\n",message);
	#endif
	sprintf((char*)p,"%s\r\n",message); // 設置發(fā)送內容
	GSM_send_cmd(p,">",100);  
	DELAYClass.DelayMs(50);
	#ifdef DEBUG_printf
	printf("4. %x\n", 0x1A);
	#endif
	USART_SendData(USART2, 0x1A); // 確認發(fā)送
}
/**
  * @brief  等待接收短信
  * @param  None
  * @retval 0:無短信,!0:接收到的短信的存放地址
  */
uint8_t GSM_waitMessage(void)
{
	// 接收到一次數(shù)據(jù)了
	if(GSM_USART_RX_STA&0X8000)		
	{ 
		GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0; // 添加結束符
#ifdef DEBUG_printf
		printf("(waitMes)%s\n", GSM_USART_RX_BUF);
#endif		
		char *strx = 0;
		// 檢索字符串  含有"SM",則代表接收到短信
		strx=strstr(GSM_USART_RX_BUF,"\"SM\",");
		// 返回不為空則檢索到指定字符串
		if(strx != ((void *)0))
		{
#ifdef DEBUG_printf
			printf("message rec success, addr : %d\n", stringToInt(strx+5));
#endif
			uint8_t addrNum = stringToInt(strx+5); // 將地址號保存
			GSM_USART_RX_STA = 0; // 清除接收標記
			return addrNum;
		}
		GSM_USART_RX_STA = 0;
	} 
	return 0;
}
/**
  * @brief  查看短信
  * @param  None
  * @retval 返回幀頭后的一個字節(jié)數(shù)據(jù)
  */
char GSM_readMessage(uint8_t addrNum)
{
	char pp[40];
	uint8_t i = 0;
	sprintf((char*)pp,"AT+CMGR=%d\r\n",addrNum); // 查看該地址下的短信
	GSM_USART_RX_STA = 0;
	// 等待2s
	for(i = 0; i <= 200; i++) 
	{
		if(i % 50 == 0) // 每0.5s重發(fā)一次
		{
#ifdef DEBUG_printf
			printf("i = %d\n", i);
#endif
			GSM_sendData("%s", pp);
		}
		DELAYClass.DelayMs(10);
		if(GSM_USART_RX_STA&0X8000)		
		{ 
			// 添加結束符
			GSM_USART_RX_BUF[GSM_USART_RX_STA&0X7FFF]=0;
#ifdef DEBUG_printf
			printf("(readMes)%s\n", GSM_USART_RX_BUF);
#endif
			char *strx = 0;
			// 檢索字符串  含有"send:",則代表查看短信成功
			strx=strstr(GSM_USART_RX_BUF,GSM_head);
			// 返回不為空則檢索到指定字符串
			if(strx != ((void *)0))
			{
#ifdef DEBUG_printf
				printf("message read success, cmd : %c\n", strx[5]);
#endif
				char cmd = 0;
				cmd = strx[5]; // 此處可根據(jù)需求修改 當前是返回的send:后的一個字節(jié)
				GSM_USART_RX_STA = 0; // 清除接收標記
				DELAYClass.DelayMs(10);
				sprintf((char*)pp,"AT+CMGD=%d\r\n",addrNum); // 刪除該地址下的短信
				GSM_sendData("%s", pp);
				return cmd;
			}
			GSM_USART_RX_STA = 0;
		}
	}
	GSM_USART_RX_STA = 0;
	return 0;
}
/**
  * @brief  GSM初始化
  * @param  None
  * @retval None
  * @note   None
	*/
void GSM_Init(void)
{
	GSM_USART_Init(9600);
	GSM_TIM3_Init();
}

GSM_func.h

#ifndef __GSM_FUNC_H
#define __GSM_FUNC_H

#include "main.h"


char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime);
int stringToInt(char *str);
void GSM_sendMessage(char *message);
uint8_t GSM_waitMessage(void);
char GSM_readMessage(uint8_t addrNum);
void GSM_Init(void);

#endif

驅動下載地址:

https://download.csdn.net/download/m0_50669075/87672911

STM32工程模板、外設模板、模塊模板下載地址:

stm32_template: STM32F103工程模板,外設模板,模塊模板。模塊模板包括:DHT11溫濕度傳感器,OLED屏幕,DS18B20溫度傳感器,DS1302時鐘模塊,紅外測溫模塊,RFID模塊,SIM900A短信模塊,OneNET入網(wǎng),ADXL345三軸傳感器,離線語音識別模塊,語音播報模塊,甲醛傳感器,PM2.5模塊,SG90舵機,健康檢測模塊,消息隊列示例,鏈表示例,分時調度系統(tǒng)示例等。文章來源地址http://www.zghlxwxcb.cn/news/detail-477541.html

到了這里,關于STM32驅動SIM900A短信模塊的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • JQ8400語音模塊-stm32f103c8t6(內含全代碼)-親測有效

    JQ8400語音模塊-stm32f103c8t6(內含全代碼)-親測有效

    一.模塊介紹 1.常見的JQ8400-FL語音模塊有兩種,一種是帶3W功放,有4M的存儲空間,可通過USB拷貝聲音文件,通過單片機串口控制;另外一種是附有SD卡槽,用SD卡存儲文件的文件(MP3格式)進行語音播報,也是通過單片機串口控制 2.我用的是二線串口通信,一線的沒試過 3.程序

    2023年04月26日
    瀏覽(20)
  • STM32F103C8T6+ESP8266WIFI+DHT11模塊連接巴法云

    1.MCU:STM32F103C8T6 2.ESP8266:正點原子WIFI模塊 3.串口模塊:正點原子串口模塊 我們對Markdown編輯器進行了一些功能拓展與語法支持,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫博客: ESP8266固件刷寫 我用的是安信可的固件,可以在官網(wǎng)上下載。正點

    2023年04月27日
    瀏覽(43)
  • STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉換

    STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉換

    目錄 一、將c8t6轉換為zet6 1、修改啟動文件 2、修改芯片 3、將MD修改為HD ?4、下載器的修改 5、修改完成,編譯成功 ?二、將zet6轉換為c8t6 最終結果如下:? ?將STM32F103C8改為STM32F103ZE ? 基本相同,反向即可。 ? ?

    2024年02月06日
    瀏覽(45)
  • STM32CubeMX配置--STM32F103C8T6最小系統(tǒng)板

    STM32CubeMX配置--STM32F103C8T6最小系統(tǒng)板

    首先是新建工程選擇左上角的 File 然后點擊 NewProject ,或者直接使用快捷鍵 Ctrl+N 新建工程 然后選擇開發(fā)板型號,在 Commercial Part Number 處輸入 STM32F103C8T6 然后在下方會有選擇 直接雙擊型號 就會進入配置界面 PINoutConfiguration (1)RCC修改 首先點擊左上角的 System Core 然后點擊

    2024年02月04日
    瀏覽(26)
  • Openmv+STM32F103C8T6視覺巡線小車

    Openmv+STM32F103C8T6視覺巡線小車

    機器視覺巡線處理是參考openmv官方代碼 Openmv官網(wǎng)源代碼:book. openmv.cc/project/follow-lines.html 根據(jù)官網(wǎng)視頻及教程將源碼注入openmv中。 小車巡的是黑線,所以顏色閾值要更改。 在文件示例中打開helloworld.py。 打開工具/機器視覺/閾值編輯器/緩沖區(qū)。 將我們需要尋跡的黑線調至全

    2023年04月09日
    瀏覽(24)
  • SG90舵機的使用--STM32F103C8T6

    SG90舵機的使用--STM32F103C8T6

    SG90帶有一個3P的接頭 根據(jù)顏色分為 黃線(信號線) 紅線(電源線) 棕色 (地線) 舵機的 工作電壓 在 4.8V-6V ,接在STM32系統(tǒng)板上驅動不了,所以需要接電源模塊單獨的5V供電,我使用的是如圖所示的電源模塊 注: 如果STM32系統(tǒng)板供電和舵機供電不為同一模塊,則需要共地,

    2024年02月03日
    瀏覽(21)
  • STM32F103標準庫函數(shù)驅動max30102心率血氧模塊

    STM32F103標準庫函數(shù)驅動max30102心率血氧模塊

    實際接線圖, 1.VIN?3v-5v都可以 2.SDA SCL 是兩根依據(jù)IIC傳輸?shù)木€(具體看你想用哪兩個IO口) 代碼里面iicStart.c有解釋 3.GND接地 4.其余的端口,我沒接,最后是可以接受到數(shù)據(jù)的。 (想更詳細了解模塊的朋友,可以看該模塊手冊)手冊放下面了 ----------------------------------------------

    2023年04月15日
    瀏覽(29)
  • [附源碼] STM32F103C8T6+外接MCP4725 外部DAC

    [附源碼] STM32F103C8T6+外接MCP4725 外部DAC

    ????????STM32F103C8T6最小系統(tǒng)板是大家很常用的一款單片機,它內部有多個ADC模數(shù)轉換通道,但并 沒有DAC數(shù)模轉換功能 ,當需要進行數(shù)字量轉換為模擬量時就需要借助外部DAC。? ?? ????????MCP4725是具有非易失性存儲器的單通道12位緩沖電壓輸出DAC。用戶可將配置寄存器

    2024年02月04日
    瀏覽(47)
  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模塊驅動LCD屏(基于正點原子歷程)

    基于STM32F103ZET6使用STM32CubeMX配置FSMC模塊驅動LCD屏(基于正點原子歷程)

    在學習STM32的過程中,剛好學到了LCD屏,我使用的是STM32F103ZET6,屏幕是正點原子的。但是在我自己新建工程點亮顯示LCD屏時遇到了很多問題。解決之后分享在此,希望能幫助到遇到此困惑的朋友。 想要快速驅動LCD屏請直接跳轉到CubeMX配置 FSMC全名叫可變靜態(tài)存儲控制器(Fle

    2024年02月15日
    瀏覽(50)
  • ESP8266 模塊簡易驅動程序 -- 基于 STM32F103 及原子云固件實現(xiàn)云功能

    ESP8266 模塊簡易驅動程序 -- 基于 STM32F103 及原子云固件實現(xiàn)云功能

    本簡易驅動程序是基于 正點原子 的ESP8266模塊,主要用于實現(xiàn)連接 原子云 的功能。MCU選用的是 STM32F103ZET6 注:原子云固件添加了 AT+ATKCLDSTA 和 AT+ATKCLDCLS 兩條指令 用于連接正點原子自家的原子云平臺,原廠的AT指令不受任何影響 本程序主要實現(xiàn)了如下功能: 設定工作模式 連

    2023年04月23日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包