本文來(lái)源電子發(fā)燒友社區(qū),作者:李元江, 帖子地址:https://bbs.elecfans.com/jishu_2026438_1_1.html
上一次帖子,已經(jīng)通過(guò)網(wǎng)絡(luò)獲取天氣數(shù)據(jù),但是還沒(méi)顯示到顯示屏上。今天的帖子我寫(xiě)的是關(guān)于如何取模天氣圖片,并顯示天氣圖標(biāo)和天氣數(shù)據(jù)。
一、ssd1306顯存填充
上一次帖子,已經(jīng)通過(guò)網(wǎng)絡(luò)獲取天氣數(shù)據(jù),但是還沒(méi)顯示到顯示屏上。今天的帖子我寫(xiě)的是關(guān)于如何取模天氣圖片,并顯示天氣圖標(biāo)和天氣數(shù)據(jù)。
顯示板使用的OLED驅(qū)動(dòng)芯片為SSD1306,我們來(lái)看看這款芯片的顯存和該顯存填充方式。下面是從SSD1303芯片手冊(cè)上的截圖,可以看得出它的顯存是大小為128*64bit的RAM,并且分成為8頁(yè),PAGE0-PAGE7。顯示板像素點(diǎn)大小為128*64,所以一個(gè)像素點(diǎn)對(duì)應(yīng)RAM中的1bit。
往RAM的某一位寫(xiě)入1或者0,該位對(duì)應(yīng)的像素點(diǎn)就顯示亮點(diǎn)或者不顯示。但是它是按照什么順序?qū)懭霐?shù)據(jù)的。下面也是從芯片手冊(cè)上的截圖。
可以看得出RAM填充順序了 ,寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)時(shí),最低位數(shù)據(jù)寫(xiě)入一頁(yè)中最上面那行,最高位寫(xiě)入一頁(yè)中最下面那行。這樣,使用取模軟件取模圖片或者字符時(shí),我們才能知道按照什么順序取模。之后再寫(xiě)相應(yīng)代碼,按照順序把取模數(shù)據(jù)寫(xiě)入RAM中。
二、天氣圖標(biāo)取模
首先當(dāng)然是先在網(wǎng)絡(luò)下載我們需要的天氣圖標(biāo),大小看你像顯示多大區(qū)域的圖標(biāo),我的是48*48大小圖標(biāo),在OLED上顯示大小也是48*48。
我使用的是下面這款取模軟件,我覺(jué)得圖標(biāo)取模不太好,不知道大家有沒(méi)有推薦的。需要根據(jù)SSD1306進(jìn)行取模軟件的設(shè)置。比較重要的是取模方式的選擇,這是跟SSD1306顯示填充順序?qū)?yīng)的,我們需要選擇列行式。其他數(shù)據(jù)點(diǎn)陣選擇48,自定義格式選擇C51。
選擇晴圖標(biāo),生成如下數(shù)組。
上面的小花就是太陽(yáng)圖標(biāo),是有點(diǎn)丑,先湊合用吧。
二、軟件設(shè)計(jì)
1、顯示天氣圖標(biāo)
我們已經(jīng)按照SSD1306顯存填充順序,取模好圖片數(shù)據(jù),接下來(lái)按照順序把數(shù)據(jù)寫(xiě)入RAM就行了,代碼如下。
- typedef enum
- {
- QINGLOGO =0,
- YINGLOGO,
- DUOYULOGO,
- YULOGO,
- LEIYULOGO,
- XUELOGO,
- }WEATHER_TYPE;
- void OLED_ShowWeather(uint8_t x,uint8_t y,WEATHER_TYPE type)
- {
- unsigned char (*temp)[48];
- //if(type ==qinglogo )
- //temp=Qing48;
- switch(type)
- {
- case QINGLOGO: temp=Qing48;break;
- case YINGLOGO: temp=Yin48;break;
- case YULOGO: temp=Yu48;break;
- case LEIYULOGO:temp=LeiYu48;break;
- case DUOYULOGO:temp=DuoYun48;break;
- case XUELOGO: temp=Xue48;break;
- default :
- temp=Qing48;
- break;
- }
- //OledSetPosition(x,y);
- for(uint8_t i=0;i<6;i++){
- OledSetPosition(x,y+i);
- for(uint8_t j = 0;j<48;j++){
- WriteData(temp[i][j]);
- }
- }
- }
OLED顯示板上的兩個(gè)按鍵,主要用于界面切換、獲取實(shí)時(shí)時(shí)間、天氣數(shù)據(jù)。增加了按鍵任務(wù),主要進(jìn)行這兩個(gè)按鍵的處理。右邊按鍵,按下后可以切換界面,現(xiàn)在設(shè)置有四個(gè)界面。在時(shí)間顯示界面按下左鍵,會(huì)獲取實(shí)時(shí)時(shí)間。在天氣顯示界面,按下左鍵會(huì)獲取實(shí)時(shí)天氣。
- #include
- #include
- #include
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "wifiiot_pwm.h"
- #include "wifiiot_adc.h"
- ?
- #include "oled_ssd1306.h"
- ?
- #defineanalog_KEY_CHAN_NAME WIFI_IOT_ADC_CHANNEL_2
- ?
- typedef enum{
- TIMESCREEN=0,
- NOWSCREEN,
- TOSCREEN,
- ATOSCREEN,
- } SCREEN_STATUS;
- extern SCREEN_STATUS Now_Screen ;
- extern SCREEN_STATUS Last_Screen ;
- ?
- typedef enum{
- GET_NORMAL =0 ,
- GET_PROPRESS,
- GET_SUC,
- GET_FAIL,
- }GET_STATUS;
- ?
- GET_STATUS Get_Status = GET_NORMAL;
- GET_STATUS Last_Get_Status = GET_NORMAL;
- ?
- extern void getNtpTime(void);
- extern bool getWeather(void);
- ?
- static float ConvertToVoltage(unsigned short data)
- {
- return (float)data * 1.8 * 4 / 4096; /* adc code equals: voltage/4/1.8*4096*/
- }
- ?
- static void KeyTask(void *arg)
- {
- (void)arg;
- unsigned short data = 0;
- ?
- GpioInit();
- static bool keyflag = false;
- while(1)
- {
- AdcRead(ANALOG_KEY_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);
- float voltage = ConvertToVoltage(data);
- ?
- if((voltage>0.45 && voltage<0.65)&&(!keyflag))
- {
- keyflag = true;
- //OledShowString(16,7,"Sync time...",1);
- //getNtpTime();
- //OledFillScreen(0);
- switch (Now_Screen){
- case TIMESCREEN:
- //OledShowString(16,7,"Sync time...",1);
- Get_Status = GET_PROPRESS;
- getNtpTime();
- //OledFillScreen(0);
- Get_Status = GET_SUC;
- break;
- case NOWSCREEN:
- //OledShowString(0,7,"Get Weather...",1);
- Get_Status = GET_PROPRESS;
- if(getWeather())
- //OledFillScreen(0);
- Get_Status = GET_SUC;
- else
- {
- //OledShowString(0,7,"Get fail...",1);
- Get_Status = GET_FAIL;
- }
- break;
- case TOSCREEN:
- Get_Status = GET_PROPRESS;
- if(getWeather())
- Get_Status = GET_SUC;
- else
- {
- Get_Status = GET_FAIL;
- }
- break;
- case ATOSCREEN:
- Get_Status = GET_PROPRESS;
- if(getWeather())
- Get_Status = GET_SUC;
- else
- {
- Get_Status = GET_FAIL;
- }
- break;
- ?
- default:
- break;
- }
- }
- else if((voltage>0.9 && voltage<1)&&(!keyflag))
- {
- keyflag = true;
- Now_Screen ++;
- if(Now_Screen > ATOSCREEN)
- {
- Now_Screen = TIMESCREEN;
- }
- }
- ?
- if((!(voltage>0.45 && voltage<0.65)) && (!(voltage>0.9 && voltage<1))) {
- keyflag = false;
- }
- ?
- usleep(300000);
- }
- }
- ?
- static void KeyTaskHandle(void)
- {
- osThreadAttr_t attr;
- attr.name = "KeyTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 4096;
- attr.priority = osPriorityNormal+2;
- ?
- if (osThreadNew(KeyTask, NULL, &attr) == NULL) {
- printf("[KeyTaskHandle] Falied to create KeyTask!n");
- }
- }
- APP_FEATURE_INIT(KeyTaskHandle);
修改oled_demo.c內(nèi)容。增加頁(yè)面切換,獲取時(shí)間、天氣數(shù)據(jù)情況提示,顯示天氣數(shù)據(jù)和天氣圖標(biāo)。
- typedef enum{
- TIMESCREEN=0,
- NOWSCREEN,
- TOSCREEN,
- ATOSCREEN,
- } SCREEN_STATUS;
- SCREEN_STATUS Now_Screen = TIMESCREEN;
- SCREEN_STATUS Last_Screen = TIMESCREEN;
- ?
- typedef enum{
- GET_NORMAL =0 ,
- GET_PROPRESS,
- GET_SUC,
- GET_FAIL,
- }GET_STATUS;
- extern GET_STATUS Get_Status ;
- extern GET_STATUS Last_Get_Status ;
- ?
- static uint8_t i=0;
- ?
- static void TimeScreenDisp(void)
- {
- //OledShow
- rtc_time_t mData;
- OLED_ShowCHinese(0,3,0);//溫
- OLED_ShowCHinese(16,3,2);//度
- OledShowChar(32,3,':',2);
- sprintf((char *)TimeStr,"%02d",
- (uint32_t)temperature);
- OledShowString(40,3,(char *)TimeStr,2);
- OLED_ShowCHinese(64,3,1);//濕
- OLED_ShowCHinese(80,3,2);//度
- OledShowChar(96,3,':',2);
- sprintf((char *)TimeStr,"%02d",
- (uint32_t)humidity);
- OledShowString(104,3,(char *)TimeStr,2);
- covUnixTimeStp2Beijing(timedata, &mData);
- sprintf((char *)TimeStr,"%04d-%02d-%02d",
- mData.ui8Year, mData.ui8Month, mData.ui8DayOfMonth);
- OledShowString(24,0,(char *)TimeStr,1);
- sprintf((char *)TimeStr,"%02d:%02d:%02d",
- mData.ui8Hour,mData.ui8Minute,mData.ui8Second);
- OledShowString(32,1,(char *)TimeStr,1);
- ?
- if(Get_Status != Last_Get_Status)
- {
- Last_Get_Status = Get_Status;
- switch ( Get_Status)
- {
- case GET_NORMAL:
- break;
- case GET_PROPRESS:
- OledShowString(16,7,"Sync time...",1);
- break;
- case GET_SUC:
- OledClearString(16,7,"Sync time...",1);
- OledShowString(16,7,"Sync Suc...",1);
- break;
- case GET_FAIL:
- OledClearString(16,7,"Sync time...",1);
- OledShowString(16,7,"Sync fail...",1);
- break;
- default:
- break;
- }
- }
- }
- ?
- static void DispWeather(uint8_t x, uint8_t y ,uint8_t code){
- switch(code)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- OLED_ShowWeather(x,y,QINGLOGO);
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- OLED_ShowWeather(x,y,DUOYULOGO);
- break;
- case 9:
- case 10:
- OLED_ShowWeather(x,y,YINGLOGO);
- break;
- case 11:
- case 12:
- ?
- OLED_ShowWeather(x,y,LEIYULOGO);
- break;
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- case 18:
- case 19:
- OLED_ShowWeather(x,y,YULOGO);
- break;
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- OLED_ShowWeather(x,y,XUELOGO);
- break;
- case 30:
- //OLED_ShowWeather(x,y,YULOGO);
- //break;
- default:
- OLED_ShowWeather(x,y,QINGLOGO);
- break;
- }
- ?
- }
- ?
- extern weather weatherValue;
- static voidWeatherDisp(SCREEN_STATUS Screen){
- switch (Screen)
- {
- case NOWSCREEN:
- DispWeather(5, 1 ,weatherValue.nowcode);
- OLED_ShowCHinese(56,0,9);//今
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d",
- (uint32_t)weatherValue.nowtemp);
- OledShowString(60,5,(char *)DispStr,2);
- OLED_ShowCHinese(76,5,13);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(100,5,(char *)DispStr,2);
- break;
- case TOSCREEN:
- DispWeather(5, 1 ,weatherValue.code[Screen-1]);
- OLED_ShowCHinese(56,0,10);//明
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(70,5,(char *)DispStr,2);
- break;
- case ATOSCREEN:
- DispWeather(5, 1 ,weatherValue.code[Screen-1]);
- OLED_ShowCHinese(56,0,11);//后
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(70,5,(char *)DispStr,2);
- break;
- default:
- break;
- }
- if(Get_Status != Last_Get_Status)
- {
- Last_Get_Status = Get_Status;
- switch ( Get_Status)
- {
- case GET_NORMAL:
- break;
- case GET_PROPRESS:
- OledShowString(0,7,"Get Weather...",1);
- break;
- case GET_SUC:
- OledClearString(0,7,"Get Weather...",1);
- OledShowString(0,7,"Get Suc...",1);
- i=0;
- break;
- case GET_FAIL:
- OledClearString(0,7,"Get Weather...",1);
- OledShowString(0,7,"Get fail...",1);
- i=0;
- break;
- default:
- break;
- }
- }
- }
- static void OledTask(void *arg)
- {
- (void)arg;
- GpioInit();
- OledInit();
- OledFillScreen(0x00);
- while (1) {
- if(Now_Screen != Last_Screen)
- {
- Last_Screen = Now_Screen;
- OledFillScreen(0);
- Get_Status = GET_NORMAL;
- Last_Get_Status = GET_NORMAL;
- i=0;
- }
- ?
- if((Get_Status == GET_FAIL) ||(Get_Status == GET_SUC))
- {
- i++;
- if(i > 20)
- {
- Get_Status = GET_NORMAL;
- i=0;
- ?
- switch(Now_Screen){
- case TIMESCREEN:
- OledClearString(16,7,"Sync time...",1);
- break;
- case NOWSCREEN:
- case TOSCREEN:
- ?
- case ATOSCREEN:
- printf("clear oled i = %dn",i);
- OledClearString(0,7,"Get Weather...",1);
- break;
- default :
- break;
- ?
- }
- }
- }
- ?
- switch (Now_Screen){
- ?
- case TIMESCREEN:
- TimeScreenDisp();
- break;
- ?
- case NOWSCREEN:
- WeatherDisp(NOWSCREEN);
- break;
- ?
- case TOSCREEN:
- WeatherDisp(TOSCREEN);
- break;
- ?
- case ATOSCREEN:
- WeatherDisp(ATOSCREEN);
- break;
- ?
- default:
- break;
- }
- usleep(100000);
- }
- }
現(xiàn)在時(shí)間調(diào)整是通過(guò)每一秒時(shí)間戳加1,再把時(shí)間戳轉(zhuǎn)化為北京時(shí)間,到達(dá)時(shí)間的更新。為了減少任務(wù)中因?yàn)槠渌瘮?shù)存在,增加時(shí)間誤差,所以單獨(dú)創(chuàng)建一個(gè)任務(wù)來(lái)進(jìn)行時(shí)間戳的調(diào)整。
- #include
- #include
- #include
- ?
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- uint32_t timedata=1608362368;
- ?
- static void RtcTask(void *arg)
- {
- (void)arg;
- while(1)
- {
- timedata++;
- sleep(1);
- }
- }
- ?
- static void RtcTaskHandle(void)
- {
- osThreadAttr_t attr;
- attr.name = "RtcTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 512;
- attr.priority = osPriorityNormal;
- ?
- if (osThreadNew(RtcTask, NULL, &attr) == NULL) {
- printf("[RtcTaskHandle] Falied to create KeyTask!n");
- }
- }
- APP_FEATURE_INIT(RtcTaskHandle);
5、修改BUILD.gn
修改OLED文件夾下的BUILD.gn文件,sources中加入keytask.c
按下右邊按鍵,可以切換界面,有四個(gè)界面,分別為時(shí)間顯示界面,今天、明天、后天天氣顯示界面。在時(shí)間顯示界面按下左鍵,會(huì)獲取實(shí)時(shí)時(shí)間,在天氣顯示界面,按下左鍵會(huì)獲取實(shí)時(shí)天氣,并且顯示天氣獲取情況提示。
????四、總結(jié)
這一篇先寫(xiě)到這里,下一篇是關(guān)于通過(guò)一個(gè)公網(wǎng)的中轉(zhuǎn)服務(wù)器,進(jìn)行wifiiot和手機(jī)之間的遠(yuǎn)程數(shù)據(jù)傳輸。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
wi-fi
+關(guān)注
關(guān)注
14文章
2097瀏覽量
124242 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1966瀏覽量
29963 -
HiSpark
+關(guān)注
關(guān)注
1文章
156瀏覽量
6895
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Wi-Fi 7與Wi-Fi 6E有什么區(qū)別
也許很多人還在考慮是否要將使用的Wi-Fi設(shè)備升級(jí)到Wi-Fi 6或Wi-Fi 6E,而這些標(biāo)準(zhǔn)的繼任者卻已經(jīng)開(kāi)始“登堂入室”了。Wi-Fi 7是新一代
IR900 Wi-Fi聯(lián)網(wǎng)的配置過(guò)程
, 通過(guò)SSID掃描可以查看;輸入密碼,點(diǎn)擊保存;
在SSID掃描頁(yè)面中查看是否連接成功, 如果沒(méi)有請(qǐng)檢查認(rèn)證方式、加密方式、密碼是否輸入正確;
Wi-Fi掃描顯示“已連接”,進(jìn)入“快速向?qū)?新建WAN
發(fā)表于 07-25 06:09
未來(lái)的Wi-Fi路由器
轉(zhuǎn)載自——鐘林談芯 沒(méi)有創(chuàng)新就沒(méi)有未來(lái),Wi-Fi路由器也是如此。 進(jìn)入2024年以后,Wi-Fi路由器市場(chǎng)變得更加艱難,利潤(rùn)大幅下滑,BOM成本價(jià)高于市場(chǎng)價(jià),接不接訂單,都陷入兩難。 國(guó)內(nèi)主芯片
DA16200 超低功耗 Wi-Fi 模塊開(kāi)發(fā)套件 Pro數(shù)據(jù)手冊(cè)
電子發(fā)燒友網(wǎng)站提供《DA16200 超低功耗 Wi-Fi 模塊開(kāi)發(fā)套件 Pro數(shù)據(jù)手冊(cè).rar》資料免費(fèi)下載
發(fā)表于 05-30 17:53
?1次下載
DA16200 超低功耗 Wi-Fi 模塊開(kāi)發(fā)套件數(shù)據(jù)手冊(cè)
電子發(fā)燒友網(wǎng)站提供《DA16200 超低功耗 Wi-Fi 模塊開(kāi)發(fā)套件數(shù)據(jù)手冊(cè).rar》資料免費(fèi)下載
發(fā)表于 05-30 17:13
?0次下載
華為獲得全球首個(gè)國(guó)際Wi-Fi聯(lián)盟WFA企業(yè)級(jí)Wi-Fi 7認(rèn)證!
Wi-Fi聯(lián)盟已發(fā)布Wi-Fi 7認(rèn)證標(biāo)準(zhǔn),華為是第一批送測(cè)廠商,獲得業(yè)界首個(gè)企業(yè)級(jí)Wi-Fi 7 的Wi-Fi聯(lián)盟官方認(rèn)證。
驗(yàn)證物聯(lián)網(wǎng)Wi-Fi HaLow用例的MM6108-EKH08開(kāi)發(fā)套件來(lái)啦
驗(yàn)證物聯(lián)網(wǎng)Wi-Fi HaLow用例的MM6108-EKH08開(kāi)發(fā)套件來(lái)啦 MM6108-EKH08開(kāi)發(fā)套件專為驗(yàn)證物聯(lián)網(wǎng)Wi-Fi HaLow用例而設(shè)計(jì)。該
Wi-Fi的誕生與發(fā)展
和5GHz兩個(gè)頻段,承載著不斷增長(zhǎng)的網(wǎng)絡(luò)需求。ABIResearch顯示,2022年Wi-Fi上傳流量激增80%,Wi-Fi數(shù)據(jù)流量已超過(guò)蜂窩流量,且成為流量增量貢
Wi-Fi HaLow和傳統(tǒng)Wi-Fi的區(qū)別
Wi-Fi HaLow和傳統(tǒng)Wi-Fi的區(qū)別? Wi-Fi是一種無(wú)線網(wǎng)絡(luò)技術(shù),可以連接到互聯(lián)網(wǎng)或局域網(wǎng),為用戶提供無(wú)線上網(wǎng)的便利。隨著科技的發(fā)展和互聯(lián)網(wǎng)的普及,Wi-Fi也在不斷演進(jìn)和
康普攜手Wi-Fi聯(lián)盟,RUCKUS Wi-Fi 7系列接入點(diǎn)成Wi-Fi
康普高級(jí)副總裁兼網(wǎng)絡(luò)、智能蜂窩和安全解決方案總裁Bart Giordano對(duì)此表示: “我們非常榮幸能與Wi-Fi Alliance形成長(zhǎng)期合作伙伴關(guān)系,將我們的RUCKUS Wi-Fi 7 接入點(diǎn)平臺(tái)作為Wi-Fi CERT
BT Wi-Fi模式是否可以通過(guò)ModustoolBox對(duì)套件進(jìn)行編程來(lái)實(shí)現(xiàn)?
想配置用于分析 CYW43439 的 CY8CPROTO-062S2-43439 原型開(kāi)發(fā)套件。
瀏覽文檔我無(wú)法弄清楚如何在不同的 Wi-Fi 和藍(lán)牙模式(電源模式、連接模式等)下配置套件。
在
發(fā)表于 01-22 06:19
Wi-Fi 6和Wi-Fi 5之間有哪些區(qū)別呢?
Wi-Fi 6和Wi-Fi 5之間有哪些區(qū)別呢? Wi-Fi 6和Wi-Fi 5是無(wú)線局域網(wǎng)標(biāo)準(zhǔn)的兩個(gè)版本,它們之間存在很多區(qū)別。Wi-Fi
什么是2.4 GHz Wi-Fi? 如何提升2.4 GHz Wi-Fi的性能?
什么是2.4 GHz Wi-Fi?2.4 GHz Wi-Fi的優(yōu)勢(shì) 2.4 GHz Wi-Fi的劣勢(shì) 如何提升2.4 GHz Wi-Fi的性能?2.4 GHz和5 GHz
什么是Wi-Fi 6?什么是Wi-Fi 6E?什么是最適合我的應(yīng)用的?
自 1999 年 Wi-Fi 聯(lián)盟成立以來(lái),Wi-Fi 技術(shù)不斷進(jìn)步,以滿足對(duì)更快速度和支持更多設(shè)備的日益增長(zhǎng)的需求。
評(píng)論