关于SNTP获取网络时间的问题
请问机智云SDK中是否有获取网络时间的函数,我现在用的是 sntp_get_real_time ,此函数返回的是包含年、月、日、时、分、秒、星期的一串字符,有没有返回单个“时”或“分”的函数?是不是需要自己转换?可以使用gagentGetNTP()函数,选择自己需要的即可。void gagentGetNTP(_tm *time)typedef struct
{
unsigned short year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
unsigned int ntp;
}_tm;
多谢,我试一下,有不懂的再来向你们请教。
请您帮我修改一下这个时间打印格式,由于初学不懂格式定义方法,请帮忙!
void Timing_control(void)
{
_tm *ptime; //这个如何正确定义这个时间打印
gagentGetNTP(&ptime);
os_printf("WIFI_NTP : [%02d:%02d] \n",ptime->hour,ptime->minute);
}
把 _tm *ptime; 改为 _tm ptime; 应该就行了 海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢!
再请您帮我分析一下flash读写问题。
请问,如何正确设置SoC ESP8266 12F FLASH读写操作,
就是下面这个是机智云自动生成数据结构体,我要求实现(断电记忆)保护,我用下面的读写方法不成功,只要执行数据写入、
程序就被破坏,必须重新烧写ESP8266程序,有几朋友都说是地址有误,可是所有地址都试了,不是破坏程序,就是没有任何结
果反应,请帮忙解决。
/** 用户区设备状态结构体*/
typedef_t struct {
bool valueLED_OnOff_0;
bool valueLED_OnOff_1;
bool valueLED_OnOff_2;
bool valueLED_OnOff_3;
bool valueTime_OnOff;
bool valueCountDown_OnOff;
uint32_t valueLED_Color;
uint32_t valueLED_R;
uint32_t valueLED_G;
uint32_t valueLED_B;
int32_t valueMotor_reversal;
uint32_t valueWeek_Repeat;
uint32_t valueMotor_is;
uint32_t valueTime_On_Minute;
uint32_t valueTime_Off_Minute;
uint32_t valueCountDown_Minute;
bool valueInfrared;
int32_t valueTemperature;
uint32_t valueHumidity;
uint32_t valuePower_Consumption;
uint32_t valuePower_Consumption1;
bool valueAlert_1;
bool valueAlert_2;
bool valueFault_LED;
bool valueFault_Motor;
bool valueFault_TemHum;
bool valueFault_IR;
} dataPoint_t;
/** 用户区当前设备状态结构体*/
extern dataPoint_t currentDataPoint;
ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。
#define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。
写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, ¤tDataPoint, sizeof(currentDataPoint));
读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, ¤tDataPoint, sizeof(currentDataPoint));
下面这个是根据上面的结构体,重新自定义结构体,可是只要上电启动初始化执行读数据,程序就被破坏,必须重新烧写
ESP8266 12F。而使用上面的那个结构体只有写操作才破坏程序,这到底是怎么回事,请指教。
/** 用户区设备状态结构体*/
typedef_t struct {
bool valueTime_OnOff;
bool valueCountDown_OnOff;
uint32_t valueLED_Color;
uint32_t valueLED_R;
uint32_t valueLED_G;
uint32_t valueLED_B;
uint32_t valueMotor_is;
int32_t valueMotor_reversal;
uint32_t valueWeek_Repeat;
uint32_t valueTime_On_Minute;
uint32_t valueTime_Off_Minute;
uint32_t valueCountDown_Minute;
} espdataPoint_t;
/** 用户区当前设备状态结构体*/
extern espdataPoint_t esp_flash;
ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设各个地址都一样,只要启动读操作,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD
#define ESP_PARAM_START_SEC 0x3C
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC
写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, &esp_flash, sizeof(esp_flash));
读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, &cesp_flash, sizeof(esp_flash));
hydyguo 发表于 2017-7-11 09:10
海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢!
再请您帮我分析一下fl ...
设0X7D,0XFD这两个地址应该没错,但读写数据到flash必须是4字节对齐,好象你的数据不是4字节的倍数,可能你写入就失败了,所以就读不到数据了。 这个4字节的倍数应该怎么处理,您能给我一个例子吗,谢谢你! hydyguo 发表于 2017-7-12 09:21
这个4字节的倍数应该怎么处理,您能给我一个例子吗,谢谢你!
我也是个新手,没用过这,你试一下改成这样行不行:
system_param_save_with_protect(ESP_PARAM_START_SEC,(uint32 *)esp_flash, sizeof(esp_flash));
还是没有结果,看来机智云大神都躲庙里修仙去了,让我们两个新手在这里瞎折腾了。谢谢你! 本帖最后由 海底沙 于 2017-7-15 17:36 编辑
hydyguo 发表于 2017-7-12 10:31
还是没有结果,看来机智云大神都躲庙里修仙去了,让我们两个新手在这里瞎折腾了。谢谢你! ...
不知你解决没有?今天有空试了一下。
如果 system_param_save_with_protect 放在有 ICACHE_FLASH_ATTR 的回调函数里,就出现重启现象,
如果没有 ICACHE_FLASH_ATTR 的回调函数里,就可行。不知为什么,有大神解答吗?
你好!这两天在画PCB板,没有看消息,我的问题还没解决,前几天问了机智云工程师,第一回复怀疑程序烧写地址不对,我将烧写地址载图给他看,说没错,要我把编译器里的Makefile里面的SPI_SIZE_MAP?=4改为6,还是没有结果,我又将出错时的串口打印数据载图给他看,至今没有回应。前天又给安信可工程师联系,今天给我回复意思还是地址问题,给我sdk文档查看,还是不知错在那。一个星期前我给乐鑫技术支持联系至今没有任何回复,看样这是死症了。
另外我看你测试的方法,把数据写入代码放到这个void ICACHE_FLASH_ATTR userTimerFunc(void)函数里可能不对,这样会造成不停在写入。
我是放在这个函数里int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)只有数据发生变化时才执行写入。读数据我是放在main里面void ICACHE_FLASH_ATTR user_init(void)初始化时读取数据。如有好结果请分享我,谢谢你! 在定时器函数中不要处理耗时较长的任务,如果要处理的话,发消息出来,在应用层中处理。
flash是慢速器件,最好不要在定时器中进行读写 请问,版主,我这个结构体数据读写代码格式到底有没有错,为什么就没有结果反应。
/** 用户区设备状态结构体*/
typedef_t struct {
bool valueLED_OnOff_0;
bool valueLED_OnOff_1;
......
uint32_t valuePower_Consumption;
uint32_t valuePower_Consumption1;
} dataPoint_t;
/** 用户区当前设备状态结构体*/
extern dataPoint_tcurrentDataPoint;
ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。
#define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC //设0X7C,0XFC这两个地址,读写操作没有任何结果出现。
写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, ¤tDataPoint, sizeof(currentDataPoint));
读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, ¤tDataPoint, sizeof(currentDataPoint)); 本帖最后由 海底沙 于 2017-7-17 16:17 编辑
hydyguo 发表于 2017-7-17 12:25
你好!这两天在画PCB板,没有看消息,我的问题还没解决,前几天问了机智云工程师,第一回复怀疑程序烧写地 ...
我的测试只是随便找的2个地方放读写函数,实际不是这样做的。
我也是放在这个函数里 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess 数据一改变写flash就出现重启
你测试一下:把int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)改为 int8_t gizwitsEventProcess(、、、)试一下。
不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE, hydyguo 发表于 2017-7-17 16:50
不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE, ...
因为我也要保存当前状态,所以今晚又测试了一下,既然可以了,真是莫明其妙,不知问题出在哪?请高手解答一下。
下面代码给你参考一下:
gizwits_product.c
/** 用户区当前设备状态结构体*/
extern dataPoint_t currentDataPoint;
/**@name Gizwits 用户API接口
* @{
*/
/**
* @brief 事件处理接口
* 说明:
* 1.用户可以对WiFi模组状态的变化进行自定义的处理
* 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口
* @param info : 事件队列
* @param data : 协议数据
* @param len : 协议数据长度
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{
uint8_t i = 0;
dataPoint_t *dataPointPtr = (dataPoint_t *)data;
moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)data;
if((NULL == info) || (NULL == data))
{
return -1;
}
for(i=0; i<info->num; i++)
{
switch(info->event)
{
case EVENT_SOCKET_ONOFF_A:
currentDataPoint.valuesocket_OnOff_a = dataPointPtr->valuesocket_OnOff_a;
os_printf("Evt: EVENT_SOCKET_ONOFF_A %d \n", currentDataPoint.valuesocket_OnOff_a);
if(0x01 == currentDataPoint.valuesocket_OnOff_a)
{
//user handle
}
break;
case EVENT_TIMING_START:
currentDataPoint.valuetiming_start = dataPointPtr->valuetiming_start;
os_printf("Evt: EVENT_TIMING_START %d \n", currentDataPoint.valuetiming_start);
if(0x01 == currentDataPoint.valuetiming_start)
{
//user handle
}
break;
case EVENT_TIMED_TASK:
currentDataPoint.valuetimed_task = dataPointPtr->valuetimed_task;
os_printf("Evt: EVENT_TIMED_TASK %d\n", currentDataPoint.valuetimed_task);
switch(currentDataPoint.valuetimed_task)
{
case TIMED_TASK_VALUE0:
//user handle
break;
case EVENT_TIMING_HOUR:
currentDataPoint.valuetiming_hour = dataPointPtr->valuetiming_hour;
os_printf("Evt:EVENT_TIMING_HOUR %d\n",currentDataPoint.valuetiming_hour);
//user handle
}
break;
case EVENT_TIMING_MINUTE:
currentDataPoint.valuetiming_minute = dataPointPtr->valuetiming_minute;
os_printf("Evt:EVENT_TIMING_MINUTE %d\n",currentDataPoint.valuetiming_minute);
//user handle
}
break;
case WIFI_SOFTAP:
break;
case WIFI_AIRLINK:
break;
case WIFI_STATION:
break;
case WIFI_CON_ROUTER:
break;
case WIFI_DISCON_ROUTER:
break;
case WIFI_CON_M2M:
break;
case WIFI_DISCON_M2M:
break;
case WIFI_RSSI:
os_printf("RSSI %d\n", wifiData->rssi);
break;
case TRANSPARENT_DATA:
os_printf("TRANSPARENT_DATA \n");
//user handle , Fetch data from , size is
break;
default:
break;
}
}
system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0);
system_param_save_with_protect(0x7D, (uint32 *)¤tDataPoint, sizeof(currentDataPoint));
os_printf("### save timing ### \n");
return 0;
}
读函数:(临时位置)
user_main.c
/** 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;
dataPoint_t currentDataPoint_my; //新定义一个结构体保存从flash读出的数据
void ICACHE_FLASH_ATTR userTimerFunc(void)
{
system_param_load(0x7D, 0, (uint32 *)¤tDataPoint_my,sizeof(currentDataPoint_my));
os_printf("### timing : %d \n",currentDataPoint_my.valuetiming_minute);
system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0);
}
如果你那边能读写,采用你的方法和我前面试的一样,不知怎么回事,只要是自定义结构体,一执行读数据程序就被破坏,必须重新烧写,
刚才我做了几个试验,在0X7D,0XFDl加上参数,就是0X7D*4*4096,读数据没有反应,执行写数据时串口一直显示如下图。如果用0X7C,0XFC加这个参数,程序直接破坏、死file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\539384885\QQ\WinTemp\RichOle\2_8{4]9_OZSKQ(_L@L`J5SL.png机。上一种方法还能复位正常,这个问题真是可笑。就怎么两行代码真是别死人,三大运营商没有一家给个说法。
本帖最后由 海底沙 于 2017-7-18 11:36 编辑
hydyguo 发表于 2017-7-18 10:48
如果你那边能读写,采用你的方法和我前面试的一样,不知怎么回事,只要是自定义结构体,一执行读数据程序就 ...
不知你的代码是否很大,我昨晚把add改到第三个1k的最后,直接把地址写成 0x27D ,测试也通过。
不要“在0X7D,0XFDl加上参数,就是0X7D*4*4096”,直接写地址0x27D 。
另外,你在¤tDataPoint前面加上 (uint32 *) 没有?
你好!您昨天中午发的信息,今天上午才看到,昨天一直没有信息提示,不知为什么。
同样的方法在你那边能用,我这里就不行,我想请您帮忙,把我在机智云生成的一套架构只加入这两个读写代码,请在你那边测试一下,看是什么情况。不过,要在APP和SoC中加入你的APP ID和Product Key才能通信,不知现在可不可以,以前我测试过还行,现在机智云不一段升级,只要不是注册用户自己生成的数据点,都很难使用。要不给你的QQ发到我消息里,帮我试试看,谢谢你!
页:
[1]
2