定义char dog[]="wang\0miao";那么sizeof(dog)与strlen(dog)分别是多少:

这篇博客探讨了C语言中定义字符数组`char dog[]="wangmiao";`时,`sizeof(dog)`和`strlen(dog)`返回值的不同。`sizeof`返回数组占用的总字节数,包括结束符``,而`strlen`计算字符串的实际长度,到第一个``为止。

定义char dog[]="wang\0miao";那么sizeof(dog)与strlen(dog)分别是多少:

正确答案: A   你的答案: 空 (错误)

10,4
4,4
9,9
9,4


A。
sizeof返回数组所占的字节数,'wang' 'miao'共占8字节,显式'\0'占1字节,字符串末尾隐式'\0'占1字节,共10字节。
strlen返回字符串的长度,以遇到'\0'结束符为准,因此为4。

//单片机头文件 #include "stm32f10x.h" //网络设备 #include "communication.h" //协议文件 #include "onenet.h" //硬件驱动 #include "usart.h" #include "delay.h" #include "led.h" //C库 #include <string.h> #include <stdio.h> #include <stdlib.h> #define PROID "1UaT634JYR" //产品ID #define DEVICE_NAME "4G_STM32" //设备名称 #define MQTTCFG "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,\"4G_STM32\",\"1UaT634JYR\",\"version=2018-10-31&res=products%2F1UaT634JYR%2Fdevices%2F4G_STM32&et=1956499200&method=sha1&sign=OK%2BTnHFOJGFAXc6uVsI3XI7fPW4%3D\"\r\n" #define MQTTSUB "AT+MQTTSUB=0,\"$sys/1UaT634JYR/4G_STM32/cmd/#\",1\r\n" char devid[16]; char key[48]; extern unsigned char communication_buf[512]; extern u8 temperature,humidity,bmp,lsens; extern u16 mq135; extern u8 temperature_y,humidity_y,lsens_y,bmp_y,temperature_l,humidity_l; extern u16 mq135_y; //========================================================== // 函数名称: OneNet_DevLink // // 函数功能: onenet创建连接 // // 入口参数: 无 // // 返回参数: 1-成功 0-失败 // // 说明: onenet平台建立连接 //========================================================== void OneNet_DevLink(void) { // unsigned char *dataPtr; // char authorization_buf[160]; // _Bool status = 1; UsartPrintf(USART_DEBUG, "7. AT+MQTTCFG=\"pingresp\",0,1\r\n"); while(communication_SendCmd("AT+MQTTCFG=\"pingresp\",0,1\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "8. AT+MQTTCFG=\"clean\",0,1\r\n"); while(communication_SendCmd("AT+MQTTCFG=\"clean\",0,1\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "9. AT+MQTTCONN\r\n"); UsartPrintf(USART_DEBUG,MQTTCFG); while(communication_SendCmd(MQTTCFG, "+MQTTURC: \"conn\",0,0")) delay_ms(500); UsartPrintf(USART_DEBUG, "10. 订阅主题\r\n"); UsartPrintf(USART_DEBUG,MQTTSUB); while(communication_SendCmd(MQTTSUB, "+MQTTSUB")) delay_ms(500); UsartPrintf(USART_DEBUG, "11. CONNECT OK\r\n"); } unsigned char OneNet_FillBuf(char *buf) { char text[48]; memset(text, 0, sizeof(text)); strcpy(buf, "\"{\"id\":123,\"dp\":{"); memset(text, 0, sizeof(text)); sprintf(text, "\"Temperature\":[{\"v\":%d}],", temperature); strcat(buf, text); memset(text, 0, sizeof(text)); sprintf(text, "\"Humidity\":[{\"v\":%d}]",humidity); strcat(buf, text); strcat(buf, "}}\"\r\n"); return strlen(buf); } //========================================================== // 函数名称: OneNet_SendData // // 函数功能: 上传数据到平台 // // 入口参数: type:发送数据的格式 // // 返回参数: 无 // // 说明: //========================================================== void OneNet_SendData(void) { char buf[256]; char send_data[1000]; unsigned char body_len; // UsartPrintf(USART_DEBUG, "Tips: OneNet_SendData-MQTT\r\n"); memset(buf, 0, sizeof(buf)); body_len = OneNet_FillBuf(buf); if(body_len) { memset(send_data, 0, sizeof(send_data)); //获取当前需要发送的数据流的总长度 sprintf(send_data, "AT+MQTTPUB=0,\"$sys/%s/%s/dp/post/json\",1,0,0,0,",PROID,DEVICE_NAME); strcat(send_data,buf); while(communication_SendCmd(send_data, "OK")) delay_ms(500); } else { } } //========================================================== // 函数名称: OneNet_RevPro // // 函数功能: 平台返回数据检测 // // 入口参数: dataPtr:平台返回的数据 // // 返回参数: 无 // // 说明: //========================================================== void OneNet_RevPro(unsigned char *cmd) { char *dataPtrs = NULL; char numBuf[10]; int num = 0; dataPtrs = strchr((char *)cmd, ':'); //搜索':' if(dataPtrs != NULL) //如果找到了 { dataPtrs++; while(*dataPtrs >= '0' && *dataPtrs <= '9') //判断是否是下发的命令控制数据 { numBuf[num++] = *dataPtrs++; } numBuf[num] = 0; num = atoi((const char *)numBuf); //转为数值形式 if(strstr((char *)cmd, "led")) //搜索"redled" { if(num==1) { GPIO_SetBits(GPIOB,LED); } else if(num==0) { GPIO_ResetBits(GPIOB,LED); } } } communication_Clear(); //清空缓存 } #include "communication.h" //硬件驱动 #include "delay.h" #include "usart.h" //C库 #include <string.h> #include <stdio.h> unsigned char communication_buf[512]; unsigned short communication_cnt = 0, communication_cntPre = 0; //========================================================== // 函数名称: communication_Clear // // 函数功能: 清空缓存 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void communication_Clear(void) { memset(communication_buf, 0, sizeof(communication_buf)); communication_cnt = 0; } //========================================================== // 函数名称: communication_WaitRecive // // 函数功能: 等待接收完成 // // 入口参数: 无 // // 返回参数: REV_OK-接收完成 REV_WAIT-接收超时未完成 // // 说明: 循环调用检测是否接收完成 //========================================================== _Bool communication_WaitRecive(void) { if(communication_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数 return REV_WAIT; if(communication_cnt == communication_cntPre) //如果上一次的值和这次相同,则说明接收完毕 { communication_cnt = 0; //清0接收计数 return REV_OK; //返回接收完成标志 } communication_cntPre = communication_cnt; //置为相同 return REV_WAIT; //返回接收未完成标志 } //========================================================== // 函数名称: communication_SendCmd // // 函数功能: 发送命令 // // 入口参数: cmd:命令 // res:需要检查的返回指令 // // 返回参数: 0-成功 1-失败 // // 说明: //========================================================== _Bool communication_SendCmd(char *cmd, char *res) { unsigned char timeOut = 200; Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd)); while(timeOut--) { if(communication_WaitRecive() == REV_OK) //如果收到数据 { // UsartPrintf(USART_DEBUG, communication_buf); if(strstr((const char *)communication_buf, res) != NULL) //如果检索到关键词 { communication_Clear(); //清空缓存 return 0; } } delay_ms(10); } return 1; } //========================================================== // 函数名称: communication_GetIPD // // 函数功能: 获取平台返回的数据 // // 入口参数: 等待的时间(乘以10ms) // // 返回参数: 平台返回的原始数据 // // 说明: 不同网络设备返回的格式不同,需要去调试 //========================================================== unsigned char *communication_GetIPD(unsigned short timeOut) { char *ptrIPD = NULL; do { if(communication_WaitRecive() == REV_OK) //如果接收完成 { ptrIPD = strstr((char *)communication_buf, "+MQTTURC: \"publish\""); //搜索“+MQTTPUBLISH”头 if(ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间 { } else { ptrIPD = strchr(ptrIPD, ':'); //找到':' UsartPrintf(USART_DEBUG,ptrIPD); if(ptrIPD != NULL) { ptrIPD++; return (unsigned char *)(ptrIPD); } else return NULL; } } delay_ms(5); //延时等待 } while(timeOut--); return NULL; //超时还未找到,返回空指针 } //========================================================== // 函数名称: communication_Init // // 函数功能: 初始化ESP8266 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void communication_Init(void) { // u8 count=10; GPIO_InitTypeDef GPIO_Initure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ESP8266复位引脚 GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Initure.GPIO_Pin = GPIO_Pin_0; //GPIOA0-复位 高电平300ms可复位 GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_Initure); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); delay_ms(1000); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); delay_ms(250); communication_Clear(); UsartPrintf(USART_DEBUG, "1. AT\r\n"); while(communication_SendCmd("AT\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "2. AT+CSQ\r\n"); while(communication_SendCmd("AT+CSQ\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "3. AT+CGSN=1\r\n"); while(communication_SendCmd("AT+CGSN=1\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "4. AT+CPIN?\r\n"); while(communication_SendCmd("AT+CPIN?\r\n", "+CPIN: READY")) delay_ms(500); UsartPrintf(USART_DEBUG, "5. AT+CIMI\r\n"); while(communication_SendCmd("AT+CIMI\r\n", "OK")) delay_ms(500); UsartPrintf(USART_DEBUG, "6. CEREG\r\n"); while(1) { if (communication_SendCmd("AT+CEREG?\r", "+CEREG: 0,1")==0 || communication_SendCmd("AT+CEREG?\r", "+CEREG: 0,5")==0) { break; // 如果两个条件都不满足,跳出循环 } else { delay_ms(100); } } } //========================================================== // 函数名称: USART2_IRQHandler // // 函数功能: 串口2收发中断 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 { if(communication_cnt >= sizeof(communication_buf)) communication_cnt = 0; //防止串口被刷爆 communication_buf[communication_cnt++] = USART2->DR; USART_ClearFlag(USART2, USART_FLAG_RXNE); } } //单片机头文件 #include "stm32f10x.h" //网络协议层 #include "onenet.h" //网络设备 #include "communication.h" //硬件驱动 #include "sys.h" #include "delay.h" #include "usart.h" #include "dht11.h" #include "oled.h" #include "led.h" //C库 #include <string.h> u8 temperature=0,humidity=0; u8 temperature_y=50,humidity_y=70; extern unsigned char communication_buf[512]; extern unsigned short communication_cnt; /* ************************************************************ * 函数名称: Hardware_Init * * 函数功能: 硬件初始化 * * 入口参数: 无 * * 返回参数: 无 * * 说明: 初始化单片机功能以及外接设备 ************************************************************ */ void Hardware_Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置 Delay_Init(); //systick初始化 Usart1_Init(115200); //串口1,打印信息用 Usart2_Init(115200); LED_Init(); OLED_Init(); UsartPrintf(USART_DEBUG, " Hardware init OK\r\n"); } /* ************************************************************ * 函数名称: main * * 函数功能: * * 入口参数: 无 * * 返回参数: 0 * * 说明: ************************************************************ */ int main(void) { unsigned short timeCount = 0; //发送间隔变量 unsigned char *dataPtr = NULL; Hardware_Init(); //初始化外围硬件 // while(DHT11_Init()) // { // delay_ms(200); // } OLED_ShowString(20,3,"Networking"); communication_Init(); //初始化ESP8266 OLED_Clear(); OLED_ShowString(0,3," Connected to"); OLED_ShowString(30,6,"ONENET"); UsartPrintf(USART_DEBUG, "Connect MQTTs Server...\r\n"); OneNet_DevLink(); //接入OneNET OLED_Clear(); OLED_ShowString(0,0,"Temp:"); OLED_ShowString(0,3,"Humi:"); while(1) { DHT11_Read_Data(&temperature,&humidity); //读取温湿度值 OLED_ShowNum(40,0,temperature,2,16);//显示温度 OLED_ShowNum(80,0,temperature_y,2,16); OLED_ShowNum(40,3,humidity,2,16); //显示湿度 OLED_ShowNum(80,3,humidity_y,2,16); if(++timeCount >= 50) //发送间隔5s { OneNet_SendData(); //发送数据 timeCount = 0; communication_Clear(); } dataPtr = communication_GetIPD(2); if(dataPtr != NULL) OneNet_RevPro(dataPtr); } } 这份程序我的4G模块可以正常使用,上传的OneNet平台,下面的程序就不能上传到平台了,为什么? #include "stm32f10x.h" // Device header #include "sys.h" #include <stdio.h> #include <math.h> #include "Delay.h" #include "gpio.h" #include "Timer.h" #include "OLED.h" #include "AIR780E.h" #include "ATGM336H.h" #include "ds18b20.h" #include "dht11.h" #include "max30102_read.h" #include "communication.h" #include "onenet.h" #include <string.h> #include "usart.h" extern int miao,fen,shi; extern int Flag_5s; extern char phoneNumber[]; u8 phoneNumIndex = 1; char display[16];//显示存储数组 u8 setn = 0,keyNum = 99;//设置标识 u8 sendMessageFlag = 0,sendMessageFlag1 = 0,warningFlag = 0,sendMessageByKey = 0;//sendMessageFlag:0-可以发送短信,1-不可以发送短信 float longitude,latitude; float longitudeOrigin,latitudeOrigin,radius = 0.1;//radius:范围半径 u8 temperature;//体温 u8 tempMax = 40; int32_t hrAvg;//心率,单位bpm u16 xinlvMin=60,xinlvMax=120;//心率下限上限 int32_t spo2Avg; u8 temperature1=0,humidity1=0; extern unsigned char communication_buf[512]; extern unsigned short communication_cnt; /*******************************函数声明*********************************/ void Init(void); void KeyScanHandle(void);//按键扫描 //void GetDataByADC(void);//获取adc数据 void DisplayData(void);//主页面显示 void DisplaySetValue(void);//设置页面显示 void BuzzerRingsNum(u8 num);//蜂鸣器函数 void ControlFun(void); /************************************************************************/ int main(void) { unsigned short timeCount = 0; //发送间隔变量 unsigned char *dataPtr = NULL; Init(); while (1) { DHT11_Read_Data(&temperature1,&humidity1); //读取温湿度值 if(++timeCount >= 50) //发送间隔5s { OneNet_SendData(); //发送数据 timeCount = 0; communication_Clear(); } dataPtr = communication_GetIPD(2); if(dataPtr != NULL) OneNet_RevPro(dataPtr); KeyScanHandle(); if(setn == 0) { GetGpsData(); DisplayData(); ControlFun(); UsartReceiveData();//接收短信 } } } void Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); OLED_Init(); OLED_CLS(); OLED_ShowStr(0,0,(u8 *)" Hardware Init...",2,0); KEY_GPIO_Init(); BEEP_Init(); TIM3_Init(9999,7199); TIM4_Init(4999,719); DS18B20_Init(); Init_MAX30102(); Delay_ms(1000); OLED_ShowStr(0,2,(u8 *)" Basic OK",2,0); Delay_ms(500); initair780(); GPS_Init(); DHT11_Init(); // Usart1_Init(115200); Usart2_Init(115200); UsartPrintf(USART_DEBUG, " Hardware init OK\r\n"); // 网络初始化 - 分步骤显示 OLED_ShowStr(0,4,(u8 *)" NET Init...",2,0); communication_Init(); // 连接OneNet - 增加状态显示 OLED_ShowStr(0,6,(u8 *)" Connecting...",2,0); OneNet_DevLink(); // 无论连接是否成功,都继续执行 OLED_CLS(); OLED_ShowStr(0,3,(u8 *)" System Ready!",2,0); Delay_ms(1000); OLED_CLS(); } void KeyScanHandle(void) //按键扫描 { if(keyNum == 0) //设置键 { Delay_ms(20); if(keyNum == 0) { setn ++; if(setn <= 8) { if(setn < 4 || setn == 6 || setn == 7)OLED_CLS();//清屏 DisplaySetValue(); }else{ setn = 0; OLED_CLS(); //清屏 } } } if(keyNum == 1) //加键 { Delay_ms(20); if(keyNum == 1) { if(setn == 1) { phoneNumber[phoneNumIndex] = phoneNumber[phoneNumIndex] < '9' ? phoneNumber[phoneNumIndex]+1 : '0'; } if(setn == 2) { longitudeOrigin = longitude; latitudeOrigin = latitude; } if(setn == 3 && latitudeOrigin < 90.000)latitudeOrigin+=0.1; if(setn == 4 && longitudeOrigin < 180.000)longitudeOrigin+=0.1; if(setn == 5 && radius < 9.0)radius+=0.1; if(setn == 6 && tempMax < 99)tempMax++; if(setn == 7 && xinlvMax < 999)xinlvMax++; if(setn == 8 && xinlvMin < xinlvMax)xinlvMin++; DisplaySetValue(); //显示设置值 } } if(keyNum == 2) //减键 { Delay_ms(20); if(keyNum == 2) { if (setn == 0 && sendMessageByKey == 0) { sendMessageByKey = 1; //发送短信 } if(setn == 1) { phoneNumIndex = phoneNumIndex < 10 ? phoneNumIndex+1 : 1; } if(setn == 2) { longitudeOrigin = 0.00; latitudeOrigin = 0.00; } if(setn == 3 && latitudeOrigin > 0.000)latitudeOrigin-=0.1; if(setn == 4 && longitudeOrigin > 0.000)longitudeOrigin-=0.1; if(setn == 5 && radius > 0.2)radius-=0.1; if(setn == 6 && tempMax > 0)tempMax--; if(setn == 7 && xinlvMax > xinlvMin)xinlvMax--; if(setn == 8 && xinlvMin > 0)xinlvMin--; DisplaySetValue(); //显示设置值 } } keyNum = 99; } void KeyScan(void)//获取当前按键值 { if(KEY1 == 0) { keyNum = 0; } if(KEY2 == 0) { keyNum = 1; } if(KEY3 == 0) { keyNum = 2; } } void DisplayData(void) { u8 i; static u8 refresh; temperature = DS18B20_Get_Temp()/10; ReadHeartRateSpO2(&hrAvg,&spo2Avg);//获取心率 if (warningFlag == 1) { if (refresh == 0) { OLED_CLS(); refresh = 1; } OLED_DrawBMP(40,0,88,4,3); OLED_ShowStr(25,5,(u8 *)phoneNumber,2,0); }else{ if (refresh == 1) { OLED_CLS(); refresh = 0; } sprintf(display,"%02d:%02d:%02d",(My_Data.hour+8)%24,My_Data.minu,My_Data.sec); OLED_ShowStr(32,0,(u8 *)display,2,0); for(i=0;i<2;i++)OLED_ShowCN(i*16+0,2,i+17,0);//显示中文:体温 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,2,i+19,0);//显示中文:心率 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,4,i+25,0);//显示中文:温度 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,6,i+27,0);//显示中文:湿度 sprintf(display,":%2d",temperature); OLED_ShowStr(32,2,(u8 *)display,2,0); sprintf(display,":%3d",hrAvg); OLED_ShowStr(96,2,(u8 *)display,2,0); sprintf(display,":%d",temperature1); OLED_ShowStr(96,4,(u8 *)display,2,0);//显示温度 sprintf(display,":%d",humidity1); OLED_ShowStr(96,6,(u8 *)display,2,0); //显示湿度 if (Save_Data.isParseData) { for(i=0;i<2;i++)OLED_ShowCN(i*16+0,4,i+2,0);//显示中文:纬度 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,6,i+0,0);//显示中文:经度 if(Save_Data.isUsefull) { Save_Data.isUsefull = false; sprintf(display,":%f",My_Data.latitude); OLED_ShowStr(32,4,(u8 *)display,2,0); latitude = My_Data.latitude; sprintf(display,":%f",My_Data.longitude); OLED_ShowStr(32,6,(u8 *)display,2,0); longitude = My_Data.longitude; } } } } void DisplaySetValue(void) //显示设置页面 { u8 i; if(setn == 1) { for(i=0;i<2;i++)OLED_ShowCN(i*16+32,0,i+4,0);//显示中文:设置 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,0,i+6,0);//显示中文:号码 OLED_ShowStr(25, 3,(u8 *)phoneNumber, 2,0); OLED_ShowStr(25, 5,(u8 *)" ", 2,0); OLED_ShowChar(phoneNumIndex*8+25, 5,'*', 2,1); } if(setn == 2) { for(i=0;i<2;i++)OLED_ShowCN(i*16+32,0,i+4,0);//显示中文:设置 for(i=0;i<3;i++)OLED_ShowCN(i*16+64,0,i+8,0);//显示中文:中心点 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,2,i+2,0);//显示中文:经度 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,4,i+0,0);//显示中文:纬度 sprintf(display,":%.3f ",latitudeOrigin); OLED_ShowStr(32,2,(u8 *)display,2,0); sprintf(display,":%.3f ",longitudeOrigin); OLED_ShowStr(32,4,(u8 *)display,2,0); for(i=0;i<2;i++)OLED_ShowCN(i*16+16,6,i+11,1);//显示中文:同步 for(i=0;i<2;i++)OLED_ShowCN(i*16+80,6,i+13,1);//显示中文:归零 } if(setn == 3 || setn == 4 || setn == 5) { for(i=0;i<2;i++)OLED_ShowCN(i*16+32,0,i+4,0);//显示中文:设置 for(i=0;i<3;i++)OLED_ShowCN(i*16+64,0,i+8,0);//显示中文:中心点 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,2,i+2,setn-2);//显示中文:经度 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,4,i+0,setn-3);//显示中文:纬度 for(i=0;i<2;i++)OLED_ShowCN(i*16+0,6,i+15,setn-4);//显示中文:范围 sprintf(display,":%.3f",latitudeOrigin); OLED_ShowStr(32,2,(u8 *)display,2,0); sprintf(display,":%.3f",longitudeOrigin); OLED_ShowStr(32,4,(u8 *)display,2,0); sprintf(display,":%.1f",radius); OLED_ShowStr(32,6,(u8 *)display,2,0); } if(setn == 6) { for(i=0;i<2;i++)OLED_ShowCN(i*16+32,0,i+4,0);//显示中文:设置 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,0,i+17,0);//显示中文:温度 sprintf(display,"%2d",tempMax); OLED_ShowStr(56,3,(u8 *)display,2,0); OLED_ShowCentigrade(72,3); } if(setn == 7 || setn == 8) { for(i=0;i<2;i++)OLED_ShowCN(i*16+32,0,i+4,0);//显示中文:设置 for(i=0;i<2;i++)OLED_ShowCN(i*16+64,0,i+19,0);//显示中文:心率 for(i=0;i<2;i++)OLED_ShowCN(i*16,3,i+21,setn-6);//显示中文:上限 for(i=0;i<2;i++)OLED_ShowCN(i*16,6,i+23,setn-7);//显示中文:下限 sprintf(display,"%3dbpm",xinlvMax); OLED_ShowStr(48, 3,(u8 *)display, 2,0); sprintf(display,"%3dbpm",xinlvMin); OLED_ShowStr(48, 6,(u8 *)display, 2,0); } } void BuzzerRingsNum(u8 num)//蜂鸣器函数 { unsigned char i = 0; for (i = 0; i < num; i++) { BEEP = 1; Delay_ms(100); BEEP = 0; if (num != 1) Delay_ms(50); } } void ControlFun(void) { if(Flag_5s == 5) { warningFlag = 0; BEEP = 0; sendMessageByKey = 0; } if(sendMessageByKey == 1) { warningFlag = 1; Flag_5s = 0; sendMessageByKey = 2; sendMessage(0); //发送短信 BEEP = 1; } //是否超出范围 if (fabs(longitude-longitudeOrigin) > radius || fabs(latitude-latitudeOrigin) > radius) { if (sendMessageFlag == 0 && longitudeOrigin != 0.0 && latitudeOrigin != 0.0) { sendMessage(0); //发送短信 BEEP = 1; sendMessageFlag = 1; } }else{ BEEP = 0; sendMessageFlag = 0; } //数据异常或摔倒发送短信 if(temperature > tempMax || ((hrAvg != 0)&& (hrAvg>xinlvMax || hrAvg<xinlvMin)) ) { if (sendMessageFlag1 == 0) { sendMessageFlag1 = 1; sendMessage(1); //发送短信 } BuzzerRingsNum(2); }else{ sendMessageFlag1 = 0; } } void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生:TIM 中断源 { KeyScan(); TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除中断标志位 } } //单片机头文件 #include "stm32f10x.h" //网络设备 #include "communication.h" //协议文件 #include "onenet.h" //硬件驱动 #include "usart.h" #include "delay.h" //C库 #include <string.h> #include <stdio.h> #include <stdlib.h> #define PROID "1UaT634JYR" //产品ID #define DEVICE_NAME "4G_STM32" //设备名称 #define MQTTCFG "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,\"4G_STM32\",\"1UaT634JYR\",\"version=2018-10-31&res=products%2F1UaT634JYR%2Fdevices%2F4G_STM32&et=1956499200&method=sha1&sign=OK%2BTnHFOJGFAXc6uVsI3XI7fPW4%3D\"\r\n" #define MQTTSUB "AT+MQTTSUB=0,\"$sys/1UaT634JYR/4G_STM32/cmd/#\",1\r\n" char devid[16]; char key[48]; extern unsigned char communication_buf[512]; extern u8 temperature1,humidity1,bmp,lsens; extern u16 mq135; extern u8 lsens_y,bmp_y,temperature_l,humidity_l; extern u16 mq135_y; //========================================================== // 函数名称: OneNet_DevLink // // 函数功能: onenet创建连接 // // 入口参数: 无 // // 返回参数: 1-成功 0-失败 // // 说明: onenet平台建立连接 //========================================================== void OneNet_DevLink(void) { u8 retry_count = 0; UsartPrintf(USART_DEBUG, "Setting up MQTT connection...\r\n"); // 1. 设置MQTT参数 if(communication_SendCmd("AT+MQTTCFG=\"pingresp\",0,1\r\n", "OK")) { UsartPrintf(USART_DEBUG, "Ping response set failed\r\n"); } Delay_ms(500); if(communication_SendCmd("AT+MQTTCFG=\"clean\",0,1\r\n", "OK")) { UsartPrintf(USART_DEBUG, "Clean session set failed\r\n"); } Delay_ms(500); // 2. MQTT连接 UsartPrintf(USART_DEBUG, "Connecting to OneNet...\r\n"); for(retry_count = 0; retry_count < 5; retry_count++) { communication_SendCmd(MQTTCFG, ""); Delay_ms(3000); // 等待连接响应 // 检查连接状态 if(communication_SendCmd("AT+MQTTSTATE?\r\n", "+MQTTSTATE: 0,4") == 0) { UsartPrintf(USART_DEBUG, "MQTT connected successfully!\r\n"); break; } UsartPrintf(USART_DEBUG, "MQTT connecting... %d/5\r\n", retry_count+1); } if(retry_count >= 5) { UsartPrintf(USART_DEBUG, "MQTT connection failed!\r\n"); } // 3. 订阅主题 communication_SendCmd(MQTTSUB, ""); Delay_ms(1000); UsartPrintf(USART_DEBUG, "OneNet setup completed\r\n"); } unsigned char OneNet_FillBuf(char *buf) { char text[48]; memset(text, 0, sizeof(text)); memset(buf, 0, 256); // 清空缓冲区 // 修正JSON格式 strcpy(buf, "{\"id\":123,\"dp\":{"); memset(text, 0, sizeof(text)); sprintf(text, "\"Temperature\":[{\"v\":%d}],", temperature1); strcat(buf, text); memset(text, 0, sizeof(text)); sprintf(text, "\"Humidity\":[{\"v\":%d}]", humidity1); strcat(buf, text); strcat(buf, "}}"); UsartPrintf(USART_DEBUG, "JSON Data: %s\r\n", buf); // 调试输出 return strlen(buf); } //========================================================== // 函数名称: OneNet_SendData // // 函数功能: 上传数据到平台 // // 入口参数: type:发送数据的格式 // // 返回参数: 无 // // 说明: //========================================================== void OneNet_SendData(void) { char buf[256]; char send_cmd[400]; unsigned char body_len; UsartPrintf(USART_DEBUG, "Preparing to send data...\r\n"); memset(buf, 0, sizeof(buf)); memset(send_cmd, 0, sizeof(send_cmd)); body_len = OneNet_FillBuf(buf); if(body_len) { // 构建AT命令 sprintf(send_cmd, "AT+MQTTPUB=0,\"$sys/%s/%s/dp/post/json\",%d,0,0,%d,\"%s\"\r\n", PROID, DEVICE_NAME, 1, body_len, buf); UsartPrintf(USART_DEBUG, "Sending MQTT data...\r\n"); UsartPrintf(USART_DEBUG, "CMD: %s\r\n", send_cmd); // 发送数据,增加重试机制 u8 retry = 0; for(retry = 0; retry < 3; retry++) { if(communication_SendCmd(send_cmd, "OK") == 0) { UsartPrintf(USART_DEBUG, "Data sent successfully!\r\n"); break; } UsartPrintf(USART_DEBUG, "Send failed, retrying... %d/3\r\n", retry+1); Delay_ms(1000); } if(retry >= 3) { UsartPrintf(USART_DEBUG, "Data send failed after retries\r\n"); } } else { UsartPrintf(USART_DEBUG, "No data to send\r\n"); } communication_Clear(); } //========================================================== // 函数名称: OneNet_RevPro // // 函数功能: 平台返回数据检测 // // 入口参数: dataPtr:平台返回的数据 // // 返回参数: 无 // // 说明: //========================================================== void OneNet_RevPro(unsigned char *cmd) { char *dataPtrs = NULL; char numBuf[10]; int num = 0; dataPtrs = strchr((char *)cmd, ':'); //搜索':' if(dataPtrs != NULL) //如果找到了 { dataPtrs++; while(*dataPtrs >= '0' && *dataPtrs <= '9') //判断是否是下发的命令控制数据 { numBuf[num++] = *dataPtrs++; } numBuf[num] = 0; num = atoi((const char *)numBuf); //转为数值形式 } communication_Clear(); //清空缓存 } #include "communication.h" //硬件驱动 #include "Delay.h" #include "usart.h" //C库 #include <string.h> #include <stdio.h> unsigned char communication_buf[512]; unsigned short communication_cnt = 0, communication_cntPre = 0; //========================================================== // 函数名称: communication_Clear // // 函数功能: 清空缓存 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void communication_Clear(void) { memset(communication_buf, 0, sizeof(communication_buf)); communication_cnt = 0; } //========================================================== // 函数名称: communication_WaitRecive // // 函数功能: 等待接收完成 // // 入口参数: 无 // // 返回参数: REV_OK1-接收完成 REV_WAIT1-接收超时未完成 // // 说明: 循环调用检测是否接收完成 //========================================================== _Bool communication_WaitRecive(void) { if(communication_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数 return REV_WAIT1; if(communication_cnt == communication_cntPre) //如果上一次的值和这次相同,则说明接收完毕 { communication_cnt = 0; //清0接收计数 return REV_OK1; //返回接收完成标志 } communication_cntPre = communication_cnt; //置为相同 return REV_WAIT1; //返回接收未完成标志 } //========================================================== // 函数名称: communication_SendCmd // // 函数功能: 发送命令 // // 入口参数: cmd:命令 // res:需要检查的返回指令 // // 返回参数: 0-成功 1-失败 // // 说明: //========================================================== _Bool communication_SendCmd(char *cmd, char *res) { unsigned char timeOut = 50; // 减少超时时间 if(strlen(cmd) == 0) return 1; // 调试输出 UsartPrintf(USART_DEBUG, "Sending: %s", cmd); Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd)); // 如果res为空,立即返回 if(strlen(res) == 0) { Delay_ms(100); return 0; } while(timeOut--) { if(communication_WaitRecive() == REV_OK1) { UsartPrintf(USART_DEBUG, "Received: %s\r\n", communication_buf); if(strstr((const char *)communication_buf, res) != NULL) { communication_Clear(); UsartPrintf(USART_DEBUG, "Command success\r\n"); return 0; } } Delay_ms(10); } UsartPrintf(USART_DEBUG, "Command timeout\r\n"); communication_Clear(); return 1; } //========================================================== // 函数名称: communication_GetIPD // // 函数功能: 获取平台返回的数据 // // 入口参数: 等待的时间(乘以10ms) // // 返回参数: 平台返回的原始数据 // // 说明: 不同网络设备返回的格式不同,需要去调试 //========================================================== unsigned char *communication_GetIPD(unsigned short timeOut) { char *ptrIPD = NULL; do { if(communication_WaitRecive() == REV_OK1) //如果接收完成 { ptrIPD = strstr((char *)communication_buf, "+MQTTURC: \"publish\""); //搜索"+MQTTPUBLISH"头 if(ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间 { } else { ptrIPD = strchr(ptrIPD, ':'); //找到':' UsartPrintf(USART_DEBUG,ptrIPD); if(ptrIPD != NULL) { ptrIPD++; return (unsigned char *)(ptrIPD); } else return NULL; } } Delay_ms(5); //延时等待 } while(timeOut--); return NULL; //超时还未找到,返回空指针 } //========================================================== // 函数名称: communication_Init // // 函数功能: 初始化AIR780E模块 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void communication_Init(void) { GPIO_InitTypeDef GPIO_Initure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 硬件复位 GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Initure.GPIO_Pin = GPIO_Pin_0; GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_Initure); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); Delay_ms(1000); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); Delay_ms(3000); // 等待模块启动 communication_Clear(); // 只做最基本的AT测试,不等待特定响应 UsartPrintf(USART_DEBUG, "Basic module initialization...\r\n"); // 发送AT命令但不阻塞等待 communication_SendCmd("AT\r\n", ""); communication_SendCmd("AT\r\n", ""); Delay_ms(1000); // 快速检查网络状态 communication_SendCmd("AT+CEREG?\r\n", ""); Delay_ms(1000); communication_Clear(); UsartPrintf(USART_DEBUG, "Communication init finished (non-blocking)\r\n"); } //========================================================== // 函数名称: USART2_IRQHandler // // 函数功能: 串口2收发中断 // // 入口参数: 无 // // 返回参数: 无 // // 说明: //========================================================== void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 { if(communication_cnt >= sizeof(communication_buf)) communication_cnt = 0; //防止串口被刷爆 communication_buf[communication_cnt++] = USART2->DR; USART_ClearFlag(USART2, USART_FLAG_RXNE); } } 你能找到原因吗
最新发布
11-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值