700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 物联网毕设(基于stm32的智能家居系统)

物联网毕设(基于stm32的智能家居系统)

时间:2020-07-29 00:20:22

相关推荐

物联网毕设(基于stm32的智能家居系统)

第二节 硬件端实现

文章目录

目录

第二节 硬件端实现

文章目录

前言

一、配置ESP8266

1.ESP8266.c

2.ESP8266.h

3、如何使用

(1)初始化

(2) 进入主程序​

二、如何给平台发消息

1.发消息

三、补充

1 common.c

2 common.h

四、文章系列链接

五、下载链接

前言

本文主要写如何实现下层

一、配置ESP8266

1.ESP8266.c

#include "bsp_esp8266.h"#include "common.h"#include <stdio.h> #include <string.h> #include <stdbool.h>#include "bsp_SysTick.h"static void ESP8266_GPIO_Config ( void );static void ESP8266_USART_Config( void );static void ESP8266_USART_NVIC_Configuration ( void );struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };struct STRUCT_USARTx_Fram strUSART_Fram_Record = { 0 };/*** @brief ESP8266初始化函数* @param 无* @retval 无*/void ESP8266_Init ( void ){ESP8266_GPIO_Config (); ESP8266_USART_Config (); macESP8266_RST_HIGH_LEVEL();macESP8266_CH_DISABLE();}/*** @brief 初始化ESP8266用到的GPIO引脚* @param 无* @retval 无*/static void ESP8266_GPIO_Config ( void ){/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/* 配置 CH_PD 引脚*/macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* 配置 RST 引脚*/macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); }/*** @brief 初始化ESP8266用到的 USART* @param 无* @retval 无*/static void ESP8266_USART_Config ( void ){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART clock */macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );/* USART GPIO config *//* Configure USART Tx as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);/* USART1 mode config */USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;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(macESP8266_USARTx, &USART_InitStructure);/* 中断配置 */USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断 USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断 ESP8266_USART_NVIC_Configuration ();USART_Cmd(macESP8266_USARTx, ENABLE);}/*** @brief 配置 ESP8266 USART 的 NVIC 中断* @param 无* @retval 无*/static void ESP8266_USART_NVIC_Configuration ( void ){NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );/* Enable the USART2 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/** 函数名:ESP8266_Rst* 描述 :重启WF-ESP8266模块* 输入 :无* 返回 : 无* 调用 :被 ESP8266_AT_Test 调用*/void ESP8266_Rst ( void ){#if 0ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); #elsemacESP8266_RST_LOW_LEVEL();Delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL();#endif}/** 函数名:ESP8266_Cmd* 描述 :对WF-ESP8266模块发送AT指令* 输入 :cmd,待发送的指令* reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系* waittime,等待响应的时间* 返回 : 1,指令发送成功* 0,指令发送失败* 调用 :被外部调用*/bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ){ strEsp8266_Fram_Record .InfBit .FramLength = 0;//从新开始接收新的数据包printf ( "%s\r\n", cmd );if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收数据return true;Delay_ms ( waittime ); //延时strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';printf ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );strEsp8266_Fram_Record .InfBit .FramLength = 0; //清除接收标志strEsp8266_Fram_Record.InfBit.FramFinishFlag = 0; if ( ( reply1 != 0 ) && ( reply2 != 0 ) )return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); else if ( reply1 != 0 )return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );elsereturn ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );}/** 函数名:ESP8266_AT_Test* 描述 :对WF-ESP8266模块进行AT测试启动* 输入 :无* 返回 : 无* 调用 :被外部调用*///void ESP8266_AT_Test ( void )//{//macESP8266_RST_HIGH_LEVEL();////Delay_ms ( 1000 ); ////while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst (); //}void ESP8266_AT_Test ( void ){char count=0;macESP8266_RST_HIGH_LEVEL();Delay_ms ( 2000 );while ( count < 10 ){if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;ESP8266_Rst();++ count;}}/** 函数名:ESP8266_Net_Mode_Choose* 描述 :选择WF-ESP8266模块的工作模式* 输入 :enumMode,工作模式* 返回 : 1,选择成功* 0,选择失败* 调用 :被外部调用*/bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ){switch ( enumMode ){case STA:return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); case AP:return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); case STA_AP:return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); default:return false;}}/** 函数名:ESP8266_JoinAP* 描述 :WF-ESP8266模块连接外部WiFi* 输入 :pSSID,WiFi名称字符串* :pPassWord,WiFi密码字符串* 返回 : 1,连接成功* 0,连接失败* 调用 :被外部调用*/bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ){char cCmd [120];sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );}/** 函数名:ESP8266_BuildAP* 描述 :WF-ESP8266模块创建WiFi热点* 输入 :pSSID,WiFi名称字符串* :pPassWord,WiFi密码字符串* :enunPsdMode,WiFi加密方式代号字符串* 返回 : 1,创建成功* 0,创建失败* 调用 :被外部调用*/bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ){char cCmd [120];sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );}/** 函数名:ESP8266_Enable_MultipleId* 描述 :WF-ESP8266模块启动多连接* 输入 :enumEnUnvarnishTx,配置是否多连接* 返回 : 1,配置成功* 0,配置失败* 调用 :被外部调用*/bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx ){char cStr [20];sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );return ESP8266_Cmd ( cStr, "OK", 0, 500 );}/** 函数名:ESP8266_Link_Server* 描述 :WF-ESP8266模块连接外部服务器* 输入 :enumE,网络协议* :ip,服务器IP字符串* :ComNum,服务器端口字符串* :id,模块连接服务器的ID* 返回 : 1,连接成功* 0,连接失败* 调用 :被外部调用*/bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id){char cStr [100] = { 0 }, cCmd [120];switch ( enumE ){case enumTCP:sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );break;case enumUDP:sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );break;default:break;}if ( id < 5 )sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);elsesprintf ( cCmd, "AT+CIPSTART=%s", cStr );return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );}/** 函数名:ESP8266_StartOrShutServer* 描述 :WF-ESP8266模块开启或关闭服务器模式* 输入 :enumMode,开启/关闭* :pPortNum,服务器端口号字符串* :pTimeOver,服务器超时时间字符串,单位:秒* 返回 : 1,操作成功* 0,操作失败* 调用 :被外部调用*/bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ){char cCmd1 [120], cCmd2 [120];if ( enumMode ){sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );}else{sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );}}/** 函数名:ESP8266_Get_LinkStatus* 描述 :获取 WF-ESP8266 的连接状态,较适合单端口时使用* 输入 :无* 返回 : 2,获得ip* 3,建立连接* 3,失去连接* 0,获取状态失败* 调用 :被外部调用*/uint8_t ESP8266_Get_LinkStatus ( void ){if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )return 2;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )return 3;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )return 4;}return 0;}/** 函数名:ESP8266_Get_IdLinkStatus* 描述 :获取 WF-ESP8266 的端口(Id)连接状态,较适合多端口时使用* 输入 :无* 返回 : 端口(Id)的连接状态,低5位为有效位,分别对应Id5~0,某位若置1表该Id建立了连接,若被清0表该Id未建立连接* 调用 :被外部调用*/uint8_t ESP8266_Get_IdLinkStatus ( void ){uint8_t ucIdLinkStatus = 0x00;if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )ucIdLinkStatus |= 0x01;else ucIdLinkStatus &= ~ 0x01;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )ucIdLinkStatus |= 0x02;else ucIdLinkStatus &= ~ 0x02;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )ucIdLinkStatus |= 0x04;else ucIdLinkStatus &= ~ 0x04;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )ucIdLinkStatus |= 0x08;else ucIdLinkStatus &= ~ 0x08;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )ucIdLinkStatus |= 0x10;else ucIdLinkStatus &= ~ 0x10;}return ucIdLinkStatus;}/** 函数名:ESP8266_Inquire_ApIp* 描述 :获取 F-ESP8266 的 AP IP* 输入 :pApIp,存放 AP IP 的数组的首地址* ucArrayLength,存放 AP IP 的数组的长度* 返回 : 0,获取失败* 1,获取成功* 调用 :被外部调用*/uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ){char uc;char * pCh;ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );if ( pCh )pCh += 6;elsereturn 0;for ( uc = 0; uc < ucArrayLength; uc ++ ){pApIp [ uc ] = * ( pCh + uc);if ( pApIp [ uc ] == '\"' ){pApIp [ uc ] = '\0';break;}}return 1;}/** 函数名:ESP8266_UnvarnishSend* 描述 :配置WF-ESP8266模块进入透传发送* 输入 :无* 返回 : 1,配置成功* 0,配置失败* 调用 :被外部调用*/bool ESP8266_UnvarnishSend ( void ){if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )return false;return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );}/** 函数名:ESP8266_ExitUnvarnishSend* 描述 :配置WF-ESP8266模块退出透传模式* 输入 :无* 返回 : 无* 调用 :被外部调用*/void ESP8266_ExitUnvarnishSend ( void ){Delay_ms ( 1000 );macESP8266_Usart ( "+++" );Delay_ms ( 500 ); }/** 函数名:ESP8266_SendString* 描述 :WF-ESP8266模块发送字符串* 输入 :enumEnUnvarnishTx,声明是否已使能了透传模式* :pStr,要发送的字符串* :ulStrLength,要发送的字符串的字节数* :ucId,哪个ID发送的字符串* 返回 : 1,发送成功* 0,发送失败* 调用 :被外部调用*/bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId ){char cStr [20];bool bRet = false;if ( enumEnUnvarnishTx ){macESP8266_Usart ( "%s", pStr );bRet = true;}else{if ( ucId < 5 )sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );elsesprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );ESP8266_Cmd ( cStr, "> ", 0, 1000 );bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );}return bRet;}/** 函数名:ESP8266_ReceiveString* 描述 :WF-ESP8266模块接收字符串* 输入 :enumEnUnvarnishTx,声明是否已使能了透传模式* 返回 : 接收到的字符串首地址* 调用 :被外部调用*/char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ){char * pRecStr = 0;strEsp8266_Fram_Record .InfBit .FramLength = 0;strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';if ( enumEnUnvarnishTx )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;else {if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;}return pRecStr;}

2.ESP8266.h

#ifndef __BSP_ESP8266_H#define __BSP_ESP8266_H#include "stm32f10x.h"#include "common.h"#include <stdio.h>#include <stdbool.h>#if defined ( __CC_ARM )#pragma anon_unions#endif/******************************* ESP8266 数据类型定义 ***************************/typedef enum{STA,AP,STA_AP } ENUM_Net_ModeTypeDef;typedef enum{enumTCP,enumUDP,} ENUM_NetPro_TypeDef;typedef enum{Multiple_ID_0 = 0,Multiple_ID_1 = 1,Multiple_ID_2 = 2,Multiple_ID_3 = 3,Multiple_ID_4 = 4,Single_ID_0 = 5,} ENUM_ID_NO_TypeDef;typedef enum{OPEN = 0,WEP = 1,WPA_PSK = 2,WPA2_PSK = 3,WPA_WPA2_PSK = 4,} ENUM_AP_PsdMode_TypeDef;/******************************* ESP8266 外部全局变量声明 ***************************/#define RX_BUF_MAX_LEN1024 //最大接收缓存字节数extern struct STRUCT_USARTx_Fram //串口数据帧的处理结构体{char Data_RX_BUF [ RX_BUF_MAX_LEN ];union {__IO u16 InfAll;struct {__IO u16 FramLength :15; // 14:0 __IO u16 FramFinishFlag :1; // 15 } InfBit;}; } strEsp8266_Fram_Record;extern struct STRUCT_USARTx_Fram strUSART_Fram_Record;/******************************** ESP8266 连接引脚定义 ***********************************/#definemacESP8266_CH_PD_APBxClock_FUN RCC_APB2PeriphClockCmd#definemacESP8266_CH_PD_CLK RCC_APB2Periph_GPIOB #definemacESP8266_CH_PD_PORT GPIOB#definemacESP8266_CH_PD_PIN GPIO_Pin_8#definemacESP8266_RST_APBxClock_FUN RCC_APB2PeriphClockCmd#definemacESP8266_RST_CLK RCC_APB2Periph_GPIOB#definemacESP8266_RST_PORTGPIOB#definemacESP8266_RST_PIN GPIO_Pin_9#definemacESP8266_USART_BAUD_RATE 115200#definemacESP8266_USARTx USART3#definemacESP8266_USART_APBxClock_FUN RCC_APB1PeriphClockCmd#definemacESP8266_USART_CLK RCC_APB1Periph_USART3#definemacESP8266_USART_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd#definemacESP8266_USART_GPIO_CLK RCC_APB2Periph_GPIOB#definemacESP8266_USART_TX_PORTGPIOB #definemacESP8266_USART_TX_PINGPIO_Pin_10#definemacESP8266_USART_RX_PORTGPIOB#definemacESP8266_USART_RX_PINGPIO_Pin_11#definemacESP8266_USART_IRQ USART3_IRQn#definemacESP8266_USART_INT_FUNUSART3_IRQHandler/*********************************************** ESP8266 函数宏定义 *******************************************/#definemacESP8266_Usart( fmt, ... ) USART_printf ( macESP8266_USARTx, fmt, ##__VA_ARGS__ ) #definemacPC_Usart( fmt, ... )printf ( fmt, ##__VA_ARGS__ )//#definemacPC_Usart( fmt, ... )#definemacESP8266_CH_ENABLE() GPIO_SetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )#definemacESP8266_CH_DISABLE()GPIO_ResetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )#definemacESP8266_RST_HIGH_LEVEL() GPIO_SetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )#definemacESP8266_RST_LOW_LEVEL() GPIO_ResetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )/****************************************** ESP8266 函数声明 ***********************************************/void ESP8266_Init ( void );void ESP8266_Rst( void );bool ESP8266_Cmd( char * cmd, char * reply1, char * reply2, u32 waittime );void ESP8266_AT_Test ( void );bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode );bool ESP8266_JoinAP ( char * pSSID, char * pPassWord );bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode );bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx );bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id);bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver );uint8_t ESP8266_Get_LinkStatus ( void );uint8_t ESP8266_Get_IdLinkStatus ( void );uint8_t ESP8266_Inquire_ApIp( char * pApIp, uint8_t ucArrayLength );bool ESP8266_UnvarnishSend( void );void ESP8266_ExitUnvarnishSend ( void );bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId );char * ESP8266_ReceiveString( FunctionalState enumEnUnvarnishTx );#endif

3、如何使用

(1)初始化

(2) 进入主程序

二、如何给平台发消息

1.发消息

代码如下(示例):

首先使用一个字符串拼接设备数据

再使用ESP8266_SendString()函数发送给云平台

sprintf ( LED3, "POST /devices/735480495/datapoints?type=5 HTTP/1.1\napi-key:FN8vCnpwAjyjTV2m1y=zpL451i4=\nHost:\nContent-Length:8\n\n,;led3,%d",ucLed3Status);ESP8266_SendString ( ENABLE, LED3, 2, Single_ID_0 );

三、补充

1 common.c

#include "common.h"#include "stm32f10x.h"#include <stdarg.h>static char * itoa( int value, char * string, int radix );/** 函数名:USART2_printf* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库* 输入 :-USARTx 串口通道,这里只用到了串口2,即USART2*-Data 要发送到串口的内容的指针*-... 其他参数* 输出 :无* 返回 :无* 调用 :外部调用*典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );* USART2_printf( USART2, "\r\n %d \r\n", i );* USART2_printf( USART2, "\r\n %s \r\n", j );*/void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ){const char *s;int d; char buf[16];va_list ap;va_start(ap, Data);while ( * Data != 0 ) // 判断是否到达字符串结束符{ if ( * Data == 0x5c ) //'\'{switch ( *++Data ){case 'r': //回车符USART_SendData(USARTx, 0x0d);Data ++;break;case 'n': //换行符USART_SendData(USARTx, 0x0a); Data ++;break;default:Data ++;break;} }else if ( * Data == '%'){//switch ( *++Data ){ case 's': //字符串s = va_arg(ap, const char *);for ( ; *s; s++){USART_SendData(USARTx,*s);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );}Data++;break;case 'd': //十进制d = va_arg(ap, int);itoa(d, buf, 10);for (s = buf; *s; s++){USART_SendData(USARTx,*s);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );}Data++;break;default:Data++;break;} }else USART_SendData(USARTx, *Data++);while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );}}/** 函数名:itoa* 描述 :将整形数据转换成字符串* 输入 :-radix =10 表示10进制,其他结果为0*-value 要转换的整形数*-buf 转换后的字符串*-radix = 10* 输出 :无* 返回 :无* 调用 :被USART2_printf()调用*/static char * itoa( int value, char *string, int radix ){int i, d;int flag = 0;char *ptr = string;/* This implementation only works for decimal numbers. */if (radix != 10){*ptr = 0;return string;}if (!value){*ptr++ = 0x30;*ptr = 0;return string;}/* if this is a negative value insert the minus sign. */if (value < 0){*ptr++ = '-';/* Make the value positive. */value *= -1;}for (i = 10000; i > 0; i /= 10){d = value / i;if (d || flag){*ptr++ = (char)(d + 0x30);value -= (d * i);flag = 1;}}/* Null terminate the string. */*ptr = 0;return string;} /* NCL_Itoa */

2 common.h

#ifndef __COMMON_H#define __COMMON_H#include "stm32f10x.h"/******************************* 宏定义 ***************************/#define macNVIC_PriorityGroup_x NVIC_PriorityGroup_2/********************************** 函数声明 ***************************************/void USART_printf ( USART_TypeDef * USARTx, char * Data, ... );#endif /* __COMMON_H */

四、文章系列链接

第一节 模块介绍/herui_2/article/details/123964721

五、下载链接

硬件代码/download/herui_2/85078622

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。