亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
芯圣云米WIFI處理&OTA升級 單片機源程序
[打印本頁]
作者:
yuanyijie
時間:
2021-7-3 10:06
標題:
芯圣云米WIFI處理&OTA升級 單片機源程序
本工程使用了云米的WIFI模塊,OTA通過XMODEM協(xié)議進行通信,
話不多說,來個實例
單片機源程序如下:
//================================================================================
#define ALLOCATE_EXTERN
#include "Include.h"
//================================================================================
void main()
{
IO_Init();
SystemInit();
IO_Init();
Timer0_Init();
Uart1_Init();
EA = 1;
WDT_INIT();
Power_Up();
//LVD_Init();//上電讀取完Flash數(shù)據(jù)再打開低壓檢測,以免上一次數(shù)據(jù)未讀取出來,就進入掉電而寫入正確數(shù)據(jù)
RSTFR = 0x00;
while(1)
{
CLR_WDT;
/* User code */
Task_Handle();
}
}
復制代碼
#include "Mi_Wifi.h"
//命令
#define COM_NULL 0 //無命令
#define COM_MODEL 1 //發(fā)送設(shè)備型號
#define COM_VERSION 2 //發(fā)送設(shè)備版本
#define COM_BLE 3 //發(fā)送藍牙配置
#define COM_GET_DOWN 4 //獲取下發(fā)指令
#define COM_RESET 5 //發(fā)送復位指令
#define COM_CONFIG 6 //發(fā)送配網(wǎng)指令
#define COM_TEST 7 //發(fā)送產(chǎn)測指令
#define COM_NET 8 //發(fā)送網(wǎng)絡(luò)查詢指令
#define COM_GET_TIME 9 //發(fā)送獲取網(wǎng)絡(luò)時間指令
#define COM_ACTIVE_UPLOAD 10 //主動上報
#define COM_PASSIVE_UPLOAD 0X81 //被動上報,(查詢或設(shè)置設(shè)置)
#define COM_ERROR 0X82 //錯誤上報
//串口發(fā)送相關(guān)變量
u8 xdata Tx_Buf[TX_BUF_LENGTH]; //發(fā)送緩沖區(qū)
u8 idata Tx_Index; //發(fā)送索引(中斷發(fā)送時需要)
u8 idata Tx_En; //發(fā)送允許狀態(tài),1=發(fā)送中,0=發(fā)送停止
//命令處理相關(guān)變量
u8 xdata Rx_Buf[RX_BUF_LENGTH]; //接收數(shù)據(jù)處理緩沖區(qū)
u8 idata Rx_Index; //接收索引
u8 idata Rx_Ok; //接收完成
//其他變量
u8 xdata Cur_Tx_Com; //當前發(fā)送的命令或數(shù)據(jù)
u8 xdata Tx_Time; //發(fā)送循環(huán)時間
u8 xdata Resend_Count; //重發(fā)計數(shù)
u8 xdata Wifi_Status; //WIFI網(wǎng)絡(luò)狀態(tài)
u8 xdata Wifi_Init_Flag; //WIFI初始化狀態(tài)位
u8 xdata Tx_Com_Loop; //發(fā)送命令循環(huán),get_down,net,time
//命令字符串
u8 code Com_Null[] = "null"; //無指令
u8 code Com_Ble[] = "ble_config set 4529 0005"; //藍牙配置
u8 code Com_Get_Down[] = "get_down"; //獲取下行指令
u8 code Com_Reset[] = "reboot"; //WIFI重啟
u8 code Com_Config[] = "restore"; //清除WIFI配置信息(配網(wǎng))
u8 code Com_Test[] = "factory"; //進入廠測模式
u8 code Com_Net[] = "net"; //主動獲取網(wǎng)絡(luò)狀態(tài)(注:該命令即將廢棄。獲取網(wǎng)絡(luò)狀態(tài)變化的更好方法,請見MIIO_net_change)
u8 code Com_Get_Time[] = "time"; //獲取網(wǎng)絡(luò)時間
//普通字符串
u8 code str_ok[] = "ok";
u8 code str_none[] = "none";
u8 code str_down[] = "down";
u8 code str_get_properties[] = "get_properties";
u8 code str_set_properties[] = "set_properties";
u8 code str_MIIO_net_change[] = "MIIO_net_change";
u8 code str_error[] = "error";
u8 code str_update_fw[] = "update_fw";
u8 code str_result[] = "result";
u8 code str_properties_changed[] = "properties_changed";
u8 code str_result_error[] = "result \"error\"";
//網(wǎng)絡(luò)狀態(tài)
u8 code str_unprov[] = "unprov"; //未配置
u8 code str_offline[] = "offline"; //離線
u8 code str_local[] = "local"; //本地鏈接
u8 code str_cloud[] = "cloud"; //連上云
u8 code str_updating[] = "updating"; //升級中
u8 code str_uap[] = "uap"; //UAP模式
//命令表,方便發(fā)送命令
u8 code * code Com_Table[] =
{
Com_Null, //下標0
Com_Model, //下標1
Com_Version, //下標2
Com_Ble, //下標3
Com_Get_Down, //下標4
Com_Reset, //下標5
Com_Config, //下標6
Com_Test, //下標7
Com_Net, //下標8
Com_Get_Time, //下標9
};
//串口TX中調(diào)內(nèi)調(diào)用
void Uart_Tx()
{
if(Tx_En == 0)
{
return;
}
SBUF = Tx_Buf[Tx_Index];
//判斷發(fā)送結(jié)束,不作越界判斷,自行把握發(fā)送數(shù)據(jù)長度
if(Tx_Buf[Tx_Index] == '\r')
{
Tx_En = 0;
}
Tx_Index++;
}
//串口RX中斷內(nèi)調(diào)用,因為是一問一答通信方式,所以使用這種方式接收
void Uart_Rx(u8 Data)
{
if(Rx_Ok)
{
return ;
}
Rx_Buf[Rx_Index] = Data;//保存數(shù)據(jù)
Rx_Index++;
//防止溢出,主動在接收緩沖區(qū)添加添加'\r'以結(jié)束接收,(一般不會出現(xiàn)此情況)
if(Rx_Index == RX_BUF_LENGTH)
{
Rx_Buf[RX_BUF_LENGTH - 1] = '\r';
}
//判斷幀接收完成(數(shù)據(jù)幀以字符'\r'結(jié)尾)
if(Rx_Buf[Rx_Index - 1] == '\r')
{
Rx_Ok = 1;
}
}
//wifi配置,需要時調(diào)用
void Wifi_Config(u8 Config)
{
switch(Config)
{
case WIFI_CONFIG_NET:
Wifi_Init_Flag |= 0x08;//進入配網(wǎng)
break;
case WIFI_CONFIG_TEST:
Wifi_Init_Flag |= 0x04;//進入產(chǎn)測
break;
case WIFI_CONFIG_RESET:
Wifi_Init_Flag |= 0x10;//復位
break;
default:
break;
}
}
//啟動發(fā)送,利用串口發(fā)送中斷發(fā)送,提高CPU使用率
void Begin_Send()
{
Tx_Time = 11;//重置發(fā)送間隔時間n*10 ms
Tx_En = 1;//置位發(fā)送中
Tx_Index = 0;//清除發(fā)送索引
TI = 1;//人為設(shè)置跳入中斷,以啟動發(fā)送
}
//布爾,整形,浮點值填充
u8 Value_Fill(u8 xdata * data Tx_Ptr, Upload_Down data * data St_Temp)
{
if(St_Temp->Type == TYPE_BOOL)
{
//布爾類型數(shù)據(jù)填充上報
if(St_Temp->Value.Long_Data)
{
return sprintf(Tx_Ptr, " true");
}
else
{
return sprintf(Tx_Ptr, " false");
}
}
else if(St_Temp->Type == TYPE_INT)
{
//整形數(shù)據(jù)填充上報
return sprintf(Tx_Ptr, " %lu", St_Temp->Value.Long_Data);
}
//浮點數(shù)據(jù)填充上報
return sprintf(Tx_Ptr, " %g", St_Temp->Value.Float_Data);
}
//下發(fā),查詢屬性處理,填寫發(fā)送數(shù)據(jù)時,自行把握發(fā)送長度,否則緩沖區(qū)溢出
void Attribute_Handle(u8 Oper, Upload_Down data * data St_Temp, u8 xdata * data Str)
{
u8 i;
u8 xdata * data Tx_Ptr = &Tx_Buf;
WIFI_DEBUG_OUT();//功能測試時使用,掛邏輯分析儀,看什么時候接收到數(shù)據(jù),處理后返回什么數(shù)據(jù),正常工程可屏蔽
St_Temp->Siid = 0;
St_Temp->Piid = 0;
Tx_Ptr += sprintf(Tx_Ptr, str_result);
while(*Str != '\r')//判斷字符串結(jié)束
{
//查找字符' '(空格)
if(*Str == ' ')
{
if(St_Temp->Siid == 0)
{
St_Temp->Siid = atol(Str);
Str++;
continue;
}
if(St_Temp->Piid == 0)
{
St_Temp->Piid = atol(Str);
Str++;
//設(shè)置字符串 down set_proterties 2 1 true\r
//獲取字符串 down set_proterties 2 1\r
//設(shè)置值時2 1后面會有' '+參數(shù),所以需要返回重新查找' ',而獲取值時2 1結(jié)束,所以不能再返回查找' ',而是直接去處理
if(Oper == SET_VALUE)
{
continue;
}
}
St_Temp->Error = 0;//清除錯誤
//遍歷回調(diào)函數(shù)表,查找正確的處理函數(shù)
i = 0;
while(1)
{
if(Wifi_Handle_Table[i] == 0)//判斷回調(diào)函數(shù)表結(jié)束
{
i = 0xff;
break;//查找不到處理函數(shù)返回
}
if(Wifi_Handle_Table[i](Oper, St_Temp, Str + 1)) //回調(diào)函數(shù)調(diào)用
{
break;//正確處理后返回
}
i++;//指向下一個功能處理函數(shù)
}
Tx_Ptr += sprintf(Tx_Ptr, " %bu %bu", St_Temp->Siid, St_Temp->Piid); //填充SIID PIID
if(i == 0xff)
{
//無此屬性上報,格式:result siid piid -4003
Tx_Ptr += sprintf(Tx_Ptr, " -4003");
}
else
{
//查詢,成功格式:result siid piid 0 value 失敗格式:result siid piid code(錯誤碼)
//下發(fā),成功格式:result siid piid 0 失敗格式:result siid piid code(錯誤碼)
Tx_Ptr += sprintf(Tx_Ptr, " %d", (s16)St_Temp->Error);//錯誤碼填寫
if(Oper == GET_VALUE)
{
Tx_Ptr += Value_Fill(Tx_Ptr,St_Temp);//布爾,整形,浮點值填充
}
}
//清除以重新獲取SIID PIID
St_Temp->Siid = 0;
St_Temp->Piid = 0;
}
Str++;//指向下一個字符
}
Cur_Tx_Com = COM_PASSIVE_UPLOAD;//被動上報
Resend_Count = 0;//重發(fā)計數(shù)清零
*Tx_Ptr = '\r';//協(xié)議結(jié)束符
Begin_Send();
}
//主動上報處理,填寫發(fā)送數(shù)據(jù)時,自行把握發(fā)送長度,否則緩沖區(qū)溢出
void Upload_Handle()
{
u8 i = 0;
u8 Tx = 0;
Upload_Down St_Temp;
u8 xdata * data Tx_Ptr = &Tx_Buf;
while(1)
{
if(Wifi_Handle_Table[i] == 0x00)//判斷回調(diào)函數(shù)表結(jié)束
{
break;
}
if(Wifi_Handle_Table[i](SCAN_VALUE, &St_Temp, 0x00))//回調(diào)函數(shù)調(diào)用
{
//主動上報格式:properties_changed siid piid value
if(Tx == 0)
{
Tx = 1;
Tx_Ptr += sprintf(Tx_Ptr, str_properties_changed); //填充properties_changed
}
Tx_Ptr += sprintf(Tx_Ptr, " %bu %bu", St_Temp.Siid, St_Temp.Piid); //填充SIID PIID
Tx_Ptr += Value_Fill(Tx_Ptr,&St_Temp);//布爾,整形,浮點值填充
}
i++;//指向下一個功能處理函數(shù)
}
if(Tx == 0)
{
return ;//無填充數(shù)據(jù)不進行數(shù)據(jù)發(fā)送
}
Cur_Tx_Com = COM_ACTIVE_UPLOAD;//主動上報
Resend_Count = 0;//重發(fā)計數(shù)清零
*Tx_Ptr = '\r';//協(xié)議結(jié)束符
Begin_Send();//啟動發(fā)送
}
//WIFI狀態(tài)處理
void Wifi_Status_Handle(u8 xdata * data String)
{
if(My_Strcmp(String, str_cloud, 5))
{
//連接上服務器
Wifi_Status = NET_CLOUD;
}
else if(My_Strcmp(String, str_local, 5))
{
//本地連接
Wifi_Status = NET_LOCAL;
}
else if(My_Strcmp(String, str_unprov, 6))
{
//未配置
Wifi_Status = NET_UNPROV;
}
else if(My_Strcmp(String, str_offline, 7))
{
//離線
Wifi_Status = NET_OFFLINE;
}
else if(My_Strcmp(String, str_uap, 3))
{
//UAP模式
Wifi_Status = NET_UAP;
}
else if(My_Strcmp(String, str_updating, 8))
{
//升級中
Wifi_Status = NET_UPDATEING;
}
}
//WIFI下發(fā)指令處理
void Rx_Handle()
{
Upload_Down St_Temp;
u8 xdata * data Str = Rx_Buf;
//Tx_Time = 0;//接收到回復后可以立即發(fā)送下一次數(shù)據(jù),不管回復的是什么,,,正常使用沒問題,但使用固件協(xié)議檢測會失敗,限制get_down指令間隔時間需要大于100ms
if(My_Strcmp(Str, str_ok, 2))
{
switch(Cur_Tx_Com)
{
case COM_MODEL:
Wifi_Init_Flag |= 0x80;//model
break;
case COM_VERSION:
Wifi_Init_Flag |= 0x40;//版本應答
break;
case COM_BLE:
Wifi_Init_Flag |= 0x20;//藍牙應答
break;
case COM_RESET:
Wifi_Init_Flag &= ~0x10;//復位應答
break;
case COM_CONFIG:
Wifi_Init_Flag &= ~0x08;//配網(wǎng)應答
break;
case COM_TEST:
Wifi_Init_Flag &= ~0x04;//測試應答
break;
}
Cur_Tx_Com = COM_NULL;//清除當前發(fā)送命令
}
else if(My_Strcmp(Str, str_down, 4))
{
//下發(fā)命令解析
Cur_Tx_Com = COM_NULL;
Str += 5;//跳過"down "
if(My_Strcmp(Str, str_none, 4))
{
//無指令
}
else if(My_Strcmp(Str, str_update_fw, 9))
{
//進入升級模式
To_Update();
}
else if(My_Strcmp(Str, str_set_properties, 14))
{
//設(shè)置屬性
Str += 14;//跳過"set_properties "
Attribute_Handle(SET_VALUE, &St_Temp, Str);
}
else if(My_Strcmp(Str, str_get_properties, 14))
{
//獲取屬性
Str += 14;//跳過"get_properties"
Attribute_Handle(GET_VALUE, &St_Temp, Str);
}
else if(My_Strcmp(Str, str_MIIO_net_change, 15))
{
//被動獲取網(wǎng)絡(luò)狀態(tài)
Wifi_Status_Handle(&Rx_Buf[21]);
}
else
{
//錯誤
Cur_Tx_Com = COM_ERROR;//發(fā)送錯誤命令
Resend_Count = 0;//重發(fā)計數(shù)清零
sprintf (&Tx_Buf, "%s\r", str_result_error);
Begin_Send();//啟動發(fā)送
}
}
else if(My_Strcmp(Str, str_error, 5))
{
if(Cur_Tx_Com == COM_BLE)
{
Wifi_Init_Flag |= 0x04;//藍牙配置錯誤或WIFI單模跳過藍牙配置
}
}
else if(Cur_Tx_Com == COM_NET)
{
//主動獲取網(wǎng)絡(luò)狀態(tài)
Cur_Tx_Com = COM_NULL;//清除當前發(fā)送命令
Wifi_Status_Handle(Str);
}
else if(Cur_Tx_Com == COM_GET_TIME)
{
//主動獲取當前時間(一般不需要處理,如果有北京時間顯示或其他依賴網(wǎng)絡(luò)時間的應用時才需處理)
Cur_Tx_Com = COM_NULL;//清除當前發(fā)送命令
}
}
//WIFI服務程序--10毫秒調(diào)用一次
void Wifi_Service()
{
if(Rx_Ok)
{
Rx_Handle();//調(diào)用處理
Rx_Index = 0;
Rx_Ok = 0;
}
//發(fā)送間隔時間控制
if(Tx_Time)
{
Tx_Time--;
return;
}
Tx_Com_Loop++;//循環(huán)
//重發(fā)次數(shù)控制,
if(Resend_Count >= 10)
{
Cur_Tx_Com = COM_NULL;//重發(fā)n次無響應后清除
}
if(Cur_Tx_Com != COM_NULL)
{
Resend_Count++;//重發(fā)計數(shù)增加
Begin_Send();//直接重發(fā)Tx_Buf內(nèi)的數(shù)據(jù)
return ;
}
//發(fā)送相關(guān)信息
if((Wifi_Init_Flag & 0x80) == 0)
{
Cur_Tx_Com = COM_MODEL;//發(fā)送設(shè)備MODEL
}
else if((Wifi_Init_Flag & 0x40) == 0)
{
Cur_Tx_Com = COM_VERSION;//發(fā)送程序版本號
}
else if((Wifi_Init_Flag & 0x20) == 0)
{
Cur_Tx_Com = COM_BLE;//發(fā)送ble相關(guān)
}
else if(Wifi_Init_Flag & 0x10)
{
Cur_Tx_Com = COM_RESET;//發(fā)送復位
}
else if(Wifi_Init_Flag & 0x08)
{
Cur_Tx_Com = COM_CONFIG;//發(fā)送WIFI重置,進入配網(wǎng)模式
}
else if(Wifi_Init_Flag & 0x04)
{
Cur_Tx_Com = COM_TEST;//發(fā)送WIFI進入產(chǎn)測模式
}
else if(Tx_Com_Loop >= 10)
{
Tx_Com_Loop = 0;
Cur_Tx_Com = COM_NET;//主動獲取網(wǎng)絡(luò)狀態(tài)
}
else if(Tx_Com_Loop == 5)
{
Cur_Tx_Com = COM_GET_TIME;//獲取時間
}
else
{
Cur_Tx_Com = COM_GET_DOWN;
//檢測數(shù)據(jù)變化并上報數(shù)據(jù),連接上網(wǎng)絡(luò)才檢測(連接上本地或者網(wǎng)絡(luò))
if((Wifi_Status == NET_LOCAL) || (Wifi_Status == NET_CLOUD))
{
Upload_Handle();//調(diào)用后如果需要主動上報數(shù)據(jù)的話,Cur_Tx_Com的值應該是COM_ACTIVE_UPLOAD,并且數(shù)據(jù)已經(jīng)填充進發(fā)送緩沖區(qū)了
}
}
Resend_Count = 0;//重發(fā)計數(shù)清零
if(Cur_Tx_Com == COM_ACTIVE_UPLOAD)
{
Begin_Send();//啟動發(fā)送
return;
}
sprintf(&Tx_Buf, "%s\r", Com_Table[Cur_Tx_Com]);//填充指令
Begin_Send();//啟動發(fā)送
}
復制代碼
全部代碼:
HC89F3541-20210702(APP部分).7z
(150.46 KB, 下載次數(shù): 24)
2021-7-3 10:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
20210701-HC89F3541(BOOTLOAD部分).7z
(54.02 KB, 下載次數(shù): 20)
2021-7-3 10:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1