www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > wenzi嵌入式軟件
[導(dǎo)讀]今天介紹一下我使用過(guò)的一款2G網(wǎng)絡(luò)模塊,在車載行駛中使用,在很惡劣的情況下,依舊可以保證網(wǎng)絡(luò)快速鏈接。因?yàn)楝F(xiàn)在的網(wǎng)絡(luò)模塊都是差不多的,尤其是IOT、LORA以及2G 3G 4G這些通過(guò)基站進(jìn)行組網(wǎng)的模塊。


點(diǎn)擊“藍(lán)字”關(guān)注我吧

作者:良知猶存

轉(zhuǎn)載授權(quán)以及圍觀:歡迎添加微信公眾號(hào):Conscience_Remains

總述

????現(xiàn)在物聯(lián)網(wǎng)的概念越來(lái)越突出,軟件云端小米IOT平臺(tái)、阿里物聯(lián)網(wǎng)云等等,嵌入式百度手環(huán)開(kāi)源很久了,此外網(wǎng)上關(guān)于ESP8266接入網(wǎng)關(guān)進(jìn)行遠(yuǎn)程控制的源碼不計(jì)其數(shù)。

? ?物聯(lián)網(wǎng)嵌入式端開(kāi)發(fā)使用中都是各大主流網(wǎng)絡(luò)模塊,其中無(wú)線方式通信方式區(qū)分的話,主要分為兩類:一類是Zigbee、WiFi、藍(lán)牙、Z-wave等短距離通信技術(shù);另一類是LPWAN(low-powerWide-AreaNetwork,低功耗廣域網(wǎng)),即廣域網(wǎng)通信技術(shù)。

? ?至于幾種通信模塊使用的技術(shù)區(qū)別,改天可以寫(xiě)一篇文章進(jìn)行詳細(xì)介紹。不過(guò) 今天我來(lái)介紹一下,我使用過(guò)的一款2G網(wǎng)絡(luò)模塊,在車載行駛中使用,在很惡劣的情況下,依舊可以保證網(wǎng)絡(luò)快速鏈接。因?yàn)楝F(xiàn)在的網(wǎng)絡(luò)模塊都是差不多的,尤其是IOT、LORA以及2G 3G 4G這些通過(guò)基站進(jìn)行組網(wǎng)的模塊。

有興趣的朋友可以看看百度手環(huán)的開(kāi)源資料,后臺(tái)回復(fù) find me?加我好友進(jìn)行分享。



一、概念介紹


2G:第二代移動(dòng)通信技術(shù)加入更多的多址技術(shù),包括TDMA和CDMA,同時(shí)2G是數(shù)字通信,因此在抗干擾能力上大大增強(qiáng)。第二代移動(dòng)通信可以說(shuō)對(duì)接下來(lái)的3G和4G奠定了基礎(chǔ),比如分組域的引入,和對(duì)空中接口的兼容性改造,使得手機(jī)不再只有語(yǔ)音、短信這樣單一的業(yè)務(wù),還可以更有效率的連入互聯(lián)網(wǎng)(電路域也可以提供internet業(yè)務(wù),只是相對(duì)來(lái)說(shuō)分組域更適合internet業(yè)務(wù))。2G主要的制式也是兩個(gè),分別是來(lái)自歐洲ETSI組織的GSM(GPRS/EDGE)和來(lái)自美洲以高通公司為主力的TIA組織的CDMA IS95/CDMA2000 1x。

百科

????看到這里大家就有疑問(wèn)了,上面巴拉巴拉一堆介紹中,2G網(wǎng)絡(luò)看上去都是很落后的了,畢竟現(xiàn)在5G都出了。2G都沒(méi)人用了,有什么好講的。那我這里就給2G正個(gè)名。


????現(xiàn)在網(wǎng)絡(luò)通信技術(shù)發(fā)展的很快,手機(jī)等終端對(duì)最新通信技術(shù)的支持也是很及時(shí),但是也是在手機(jī)這塊。要知道手機(jī)現(xiàn)在的售價(jià)是很高的,在長(zhǎng)時(shí)間的快速更新?lián)Q代中,消費(fèi)者也逐漸接受了這些技術(shù)指標(biāo)以及消費(fèi)價(jià)格。但是在一些工業(yè)領(lǐng)域,物聯(lián)網(wǎng)產(chǎn)品中,只要很小的帶寬,網(wǎng)絡(luò)覆蓋率廣,流量費(fèi)用足夠低,甚至需要低功耗的模塊。IOT LORA就是現(xiàn)在物聯(lián)網(wǎng)選擇比較多的模塊,但是IOT依舊 也有自己的缺點(diǎn)。

????“NB-IOT實(shí)際使用沒(méi)有理論宣傳那么好,NB-IOT,功耗低、傳輸距離遠(yuǎn)、系統(tǒng)容量大,這些都是耳熟能詳?shù)暮锰幜?。但是,功耗低:在大部分?chǎng)景下,NB并不比2G功耗低多少;傳輸距離遠(yuǎn):現(xiàn)在2G網(wǎng)絡(luò)全覆蓋,NB-IOT還在鋪網(wǎng)階段,體現(xiàn)不出來(lái)優(yōu)勢(shì);系統(tǒng)容量大:當(dāng)前物聯(lián)網(wǎng)產(chǎn)品遠(yuǎn)遠(yuǎn)沒(méi)有把2G網(wǎng)絡(luò)占滿,更體現(xiàn)不出來(lái)NB能容納更多設(shè)備的優(yōu)勢(shì)了。價(jià)格貴:NB-IOT模塊比2G模塊貴3-4倍,算上運(yùn)營(yíng)商補(bǔ)貼還是要貴不少?!?/p>


????而2G由于通信模塊成本較低,不到4G模塊的三分之一。市面上的共享單車定位和開(kāi)鎖、POS刷卡支付也采用2G網(wǎng)絡(luò)連接。所以2G網(wǎng)絡(luò)現(xiàn)階段應(yīng)用還是比較廣的,所以我們之前也是采用了2G網(wǎng)絡(luò)模塊進(jìn)行的開(kāi)發(fā)。


二、模塊情況

????2G模塊比較有名就是上海移遠(yuǎn)公司的M26模塊,出來(lái)時(shí)間比較長(zhǎng)了,但是M26只有GPRS的功能。


所以我們選擇了中移的M6313模塊GPRS和GNSS二合一模塊。相關(guān)的資料現(xiàn)在也是很多了,一般我們用到是AT命令使用手冊(cè),通信流程示例手冊(cè)。通信手冊(cè)我開(kāi)發(fā)的時(shí)候還沒(méi)有,現(xiàn)在中移出了,挺開(kāi)心的,又解決了開(kāi)發(fā)者的一些難題。


首先我們開(kāi)發(fā)使用是也是云,嵌入式端沒(méi)有使用現(xiàn)在比較火的MQTT或者CoAP這些協(xié)議,而是直接使用TCP進(jìn)行端口鏈接到服務(wù)器。


因?yàn)镸6313模塊的功能和M26很像,所以這個(gè)TCP鏈接過(guò)程是可以沿用的。

三、聯(lián)網(wǎng)狀態(tài)機(jī)分析

??

?下面是當(dāng)初開(kāi)發(fā)時(shí)候的寫(xiě)一個(gè)聯(lián)網(wǎng)狀態(tài)機(jī),最后基本達(dá)到在CSQ在12~24時(shí)候,聯(lián)網(wǎng)時(shí)候可以最快達(dá)到4~5秒。


這個(gè)狀態(tài)機(jī)可以實(shí)現(xiàn)聯(lián)網(wǎng),設(shè)置模塊自動(dòng)心跳、切換IP等功能。具體的解釋也都在代碼里面展示了。

static void TCP_Conncect(const char* ipaddr, const char* ipport){ char* p = NULL; p = (char*) malloc(100); if(NULL == p) { LOG("malloc p error!\r\n"); } else { memset(p, 0, 100); sprintf(p, "AT+QIOPEN=\"TCP\",\"%s\",%s",ipaddr, ipport); mdm_send_cmd_noack((u8*)p); LOG("%s\r\n", p); //DEBUG } free(p); }/* ****************************************************************** * @brief 進(jìn)行IP修改時(shí)候IP正確性標(biāo)志清零 * @author Conqueror(征服者) * @version V1.0 * @date 2019-6-10 *******************************************************************/ u8 IsIPvalid = 0;static void ChangeIP(void){ IsIPvalid = 0; dprintf("Clear IsIPvalid!\r\n");}/* ****************************************************************** * @brief timer.c進(jìn)行調(diào)用此函數(shù)進(jìn)行判斷IP是否正常通訊 * @author Conqueror(征服者) * @version V1.0 * @date 2019-6-17 *******************************************************************/ TimTypeDef SecIPTimeManage;void SecIPManageTimer(void){ if(SecIPTimeManage.stat == TON) { (SecIPTimeManage.cunt < SecIPTimeManage.des)?(SecIPTimeManage.cunt++):\ (TimerManageInit(&SecIPTimeManage,TOFF,0),IsIPvalid=0); } }/* ****************************************************************** * @brief IP為正確可用的,可以進(jìn)行寫(xiě)進(jìn)FLASH * @author Conqueror(征服者) * @version V1.0 * @date 2019-6-17 *******************************************************************/ void IPValid(void){ if(devParam.secondTcp.addr[0] !=0) { IsIPvalid=1; TimerManageInit(&SecIPTimeManage,TOFF,0); LOG("IP Valid !\r\n"); }}/* ****************************************************************** * @brief 用于第一次連接新的IP地址的時(shí)候進(jìn)行發(fā)送測(cè)試 * @author Conqueror(征服者) * @version V1.0 * @date 2019-6-17 *******************************************************************/ static void TestTCP(void){ if(cntMdm == 1 && devParam.secondTcp.addr[0] !=0) { M6313SendTestData();/*確認(rèn)IP情況*/ TimerManageInit(&SecIPTimeManage,TON,2000);/*20s判斷*/ }}/* ****************************************************************** * @brief 判斷IP是否正確,不正確直接清零 * @author Conqueror(征服者) * @version V1.0 * @date 2019-6-17 *******************************************************************/ void IsTCPIPVaild(void){ if(gCnt.mdmTotalErr > 3&&mdmInfo.signalIntensity > 10) { memset(&devParam.secondTcp,0x00,sizeof(devParam.secondTcp));/*只要新的進(jìn)入則清除之前的數(shù)據(jù)*/ } if(IsIPvalid == 0 && SecIPTimeManage.stat == TOFF && cntMdm==1\ && econdTcp.addr[0] !=0) { LOG("IPInvalid !\r\n"); mdmFSMPWRRSTInit(); /*斷電重啟*/  memset(&devParam.secondTcp,0x00,sizeof(devParam.secondTcp));/*只要新的進(jìn)入則清除之前的數(shù)據(jù)*/ }}
void mdmFSMPWRRSTInit(void) { MDM_STA = MDM_EXE_PWRRST_ACT; /*設(shè)置mdmComFSM狀態(tài)*/ TBoxInfoType.userInfo.bit.cntMdm = 0; /*網(wǎng)絡(luò)默認(rèn)斷開(kāi)*/ SysFlag.mdmFSMRunSta = 1; /*啟動(dòng)MDM_FSM,TCP錯(cuò)誤處理程序?qū)⒃谝欢〞r(shí)間內(nèi)不執(zhí)行*/ gtimer.mdmFSMRun = gtimer.timer; /*MDM_FSM處理,開(kāi)始時(shí)刻*/ dprintf("-mdmFSM_PWRRST_Init\r\n"); }
void STOP_MDM_FSM(void){ SysFlag.mdmFSMRunSta = 0; /*MDM_FSM強(qiáng)制結(jié)束*/ gtimer.mdmFSMRun = 0;}

void mdmComFSM(void){ static u8 iTimes = 0; /*發(fā)AT CMD次數(shù)*/ static u8 mdmPwrOnCnt = 0; /*MDM開(kāi)機(jī)次數(shù)*/
if(MDM_STA != MDM_IDLE_STA) /*FSM運(yùn)行中,刷新*/ { refreshWorkTimer(); } switch(MDM_STA) { case MDM_IDLE_STA: break;/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*模塊斷電復(fù)位*/ case MDM_EXE_PWRRST_ACT: LOG("*%d<-:MDM_PWR_RST[T:%d]\r\n", MDM_EXE_PWROFF_ACT, gtimer.timer); MDM_PWR_EN_L; gtimer.mdmFSMTimerout = 0; MDM_STA = MDM_WAIT_PWRRST_RES; break; case MDM_WAIT_PWRRST_RES: if(gtimer.mdmFSMTimerout > 2000) /*超過(guò)10秒*/ { gtimer.mdmFSMTimerout = 0; MDM_PWR_EN_H;????????LOG("MDM_PWR_EN_H!\r\n"); MDM_STA = MDM_EXE_PWRON_ACT; LOG("MDM_PWR_RST Finish!\r\n"); }??????break;?? /*模塊關(guān)機(jī)*/ case MDM_EXE_PWROFF_ACT: /*模塊關(guān)機(jī):開(kāi)機(jī)狀態(tài)模塊的PWRKEY拉低1s關(guān)機(jī)*/ LOG("\r\n*Step:%d,MDM_EXE_PWROFF_ACT,time:%d\r\n", MDM_EXE_PWROFF_ACT, gtimer.timer); MDM_PWRKEY_EN_H; gtimer.mdmFSMTimerout = 0; MDM_STA = MDM_WAIT_PWROFF_RES; break; case MDM_WAIT_PWROFF_RES: if(gtimer.mdmFSMTimerout > 200) /*超過(guò)1秒*/ { gtimer.mdmFSMTimerout = 0; MDM_PWRKEY_EN_L; /*m6313的PWRKEY處產(chǎn)生高電平*/ MDM_STA = MDM_WAIT_PWROFF_DELAY; LOG("MDM_PWRKEY_EN_L,PWROFF_time:%d\r\n", gtimer.timer); } break; case MDM_WAIT_PWROFF_DELAY: if(gtimer.mdmFSMTimerout > 2400) /*12秒等待,模塊關(guān)機(jī)完成*/ { LOG("MDM_POWER_OFF finish\r\n"); MDM_STA = MDM_EXE_PWRON_ACT; } break; /*模塊開(kāi)機(jī)*/ case MDM_EXE_PWRON_ACT: /*模塊開(kāi)機(jī):在關(guān)機(jī)狀態(tài)模塊的PWRKEY拉低2s開(kāi)機(jī)*/ LOG("\r\n*Step:%d,MDM_EXE_PWRON_ACT,time:%d\r\n", MDM_EXE_PWRON_ACT,gtimer.timer); M6313ComInit(); MDM_PWRKEY_EN_H; gtimer.mdmFSMTimerout = 0; MDM_STA = MDM_WAIT_PWRON_RES; break; case MDM_WAIT_PWRON_RES: if(gtimer.mdmFSMTimerout > 400) /*超過(guò)2秒*/ { MDM_PWRKEY_EN_L; /*PWRKEY開(kāi)機(jī)流程結(jié)束*/ mdmPwrOnCnt++; LOG("MDM_POWER_ON,,time:%d\r\n", gtimer.timer); MDM_STA = MDM_TX_AT_CMD; } break; /*檢查MDM通信*/ case MDM_TX_AT_CMD: LOG("\r\n*Step:%d,AT\r\n", MDM_TX_AT_CMD);//step 1 LOG("AT-%d-\r\n", iTimes);??????mdm_send_cmd_noack((u8*)"AT");
iTimes++; gtimer.mdmFSMTimerout = 0; MDM_STA = MDM_WAIT_AT_RES; break; case MDM_WAIT_AT_RES: if(!mdm_check_str((u8*)"OK")) /*查詢到OK*/ {????????LOG("AT-OK-%d-\r\n",?iTimes);
if(mdmPwrOnCnt > 0) { MDM_STA = MDM_WAIT_GSM_READY; /*模塊開(kāi)機(jī),需要一定時(shí)間,等待GSM注冊(cè)成功*/ gtimer.mdmFSMTimerout = 0; }????????else{ MDM_STA = MDM_START_INIT; } } else if(gtimer.mdmFSMTimerout > 400) /*本次等待2秒超時(shí)*/ { if(iTimes < EXE_AT_TIMES) { MDM_STA = MDM_TX_AT_CMD; /*繼續(xù)發(fā)送AT*/ LOG("continue-%d- send\"AT\"\r\n", iTimes); } else /*iTimes超過(guò)次數(shù)*/ { iTimes = 0; LOG("AT error,%d times\r\n", EXE_AT_TIMES); if(mdmPwrOnCnt < EXE_MDM_PWRON_TIMES) { MDM_STA = MDM_EXE_PWRON_ACT; //進(jìn)入開(kāi)機(jī)流程 LOG(".MDM_EXE_PWRON_ACT\r\n"); } else { mdmPwrOnCnt = 0; /*開(kāi)機(jī)次數(shù)清零*/ MDM_STA = MDM_IDLE_STA; STOP_MDM_FSM(); /*MDM_FSM結(jié)束*/ gCnt.mdmTotalErr++; LOG("send \"AT\" %d times error,mdmTotalErr++\r\n", EXE_AT_TIMES); } } } break;
case MDM_WAIT_GSM_READY: /*等待GSM網(wǎng)絡(luò)注冊(cè)成功*/ if(!mdmWaitGSMReady()) { MDM_STA = MDM_START_INIT; /*GSM注冊(cè)成功*/ LOG("MDM_GSM_READY\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_GSM_READY_MAX_TIME) { MDM_STA = MDM_START_INIT; /*GSM注冊(cè)失敗*/ LOG("MDM_GSM_NO_READY\r\n"); } break; /*MDM初始化配置*/ case MDM_START_INIT: /*開(kāi)始初始化*/ LOG("\r\n*Step:%d,MDM_START_INIT\r\n", MDM_START_INIT); MDM_STA = MDM_TX_ATQINDI_CMD; break;
#if 1 //190115 case MDM_TX_ATQINDI_CMD://AT+QINDI配置是否緩存接收到的數(shù)據(jù) LOG("*%d<-:AT+QINDI=2[%d]\r\n", MDM_TX_ATQINDI_CMD, iTimes); mdm_send_cmd_noack((u8*)"AT+QINDI=2"); //0-不緩存 2-緩存模式 iTimes++; MDM_STA = MDM_WAIT_ATQINDI_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQINDI_RES: if(!mdm_check_result((u8*)"OK")) { MDM_STA = MDM_TX_ATCMVERSION_CMD; LOG("->:OK[%d]\r\n", iTimes); gCnt.fsmErrCnt = 0; } else if(!mdm_check_result((u8*)"ERROR")) { MDM_STA = MDM_TX_ATCMVERSION_CMD; LOG("->:ERROR[%d]\r\n", iTimes); gCnt.fsmErrCnt = 0; if(iTimes < 3) //190220 { MDM_STA = MDM_TX_ATQINDI_CMD; } else { iTimes = 0; MDM_STA = MDM_TX_ATCMVERSION_CMD; LOG("AT+QINDI=2,error 3 times!\r\n"); gCnt.fsmErrCnt++; } } else if(gtimer.mdmFSMTimerout > 400) { if(iTimes < 3) { MDM_STA = MDM_TX_ATQINDI_CMD; } else { iTimes = 0; MDM_STA = MDM_TX_ATCMVERSION_CMD; LOG("AT+QINDI=2,error 3 times!\r\n"); gCnt.fsmErrCnt++; } } break; #endif /*查版本*/ case MDM_TX_ATCMVERSION_CMD: LOG("*<-%d:AT+CMVERSION\r\n", MDM_TX_ATCMVERSION_CMD); memset(USART1_RX_BUF, 0, sizeof(USART1_RX_BUF)); mdm_send_cmd_noack((u8*)"AT+CMVERSION"); MDM_STA = MDM_WAIT_ATCMVERSION_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCMVERSION_RES: if(!mdm_check_str((u8*)"M6313")) { char* p = strstr((const char*)USART1_RX_BUF, (const char*)"M6313"); /*USART1_RX_STA被mdm_check_str清0了*/ if(NULL != p)//格式:M6313-MBRH0S02-release-EXT-20181025 { char* p1 = NULL; p1 = strchr((const char*)USART1_RX_BUF, '-'); /*第一個(gè)'-'內(nèi)容*/ if(NULL !=p1) { strncpy(mdmInfo.MDMSoftInfo, p1+1, 8); /*取"MBRH0S02"*/ } char* p2 = NULL; p2 = strrchr((const char*)USART1_RX_BUF, '-'); /*最后一個(gè)'-'內(nèi)容*/ if((NULL!=p2) && (p2!=p1)) { strncpy(&mdmInfo.MDMSoftInfo[8], p2+3, 6);/*取"181025"*/ } mdmInfo.MDMSoftInfo[14] = '\0'; p1 = NULL; p2 = NULL; LOG("Copy...\r\n"); } else { LOG("Copy error!\r\n"); } p = NULL;
????????MDM_STA?=?MDM_TX_ATQITKA_CMD;????????? LOG("->:M6313...\r\n"); } else if(gtimer.mdmFSMTimerout > 200) {
????????MDM_STA?=?MDM_TX_ATQITKA_CMD;??????? LOG("Fault\r\n"); } break; /*TCP自動(dòng)心跳 AT+QITKA=< keepalive >[,][,][,< keepcount>]*/ //MDM_AUTO_TICK_EN case MDM_TX_ATQITKA_CMD: LOG("*<-%d:AT+QITKA=1,60,300,3\r\n", MDM_TX_ATQITKA_CMD); mdm_send_cmd_noack((u8*)"AT+QITKA=1,60,300,3"); MDM_STA = MDM_WAIT_ATQITKA_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQITKA_RES: if(!mdm_check_str((u8*)"OK")) { MDM_STA = MDM_TX_ATQSCLK_CMD; LOG("->:OK\r\n"); } else if(gtimer.mdmFSMTimerout > 200) { MDM_STA = MDM_TX_ATQSCLK_CMD; LOG("Fault\r\n"); } break; /*設(shè)置慢時(shí)鐘*/ case MDM_TX_ATQSCLK_CMD: /*慢時(shí)鐘*/ LOG("\r\n*Step:%d,AT+QSCLK\r\n", MDM_TX_ATQSCLK_CMD);??????mdm_send_cmd_noack((u8*)"AT+QSCLK=1");?/*開(kāi)啟慢時(shí)鐘*///修改?lyn?2018.10.6
MDM_STA = MDM_WAIT_ATQSCLK_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQSCLK_RES: if(!mdm_check_str((u8*)"OK")) { MDM_STA = MDM_TX1_ATGSN_CMD;????????LOG("AT+QSCLK=1?ok\r\n"); } else if(gtimer.mdmFSMTimerout > 200) /*1s超時(shí)*/ { MDM_STA = MDM_TX1_ATGSN_CMD;????????LOG("AT+QSCLK=1?error\r\n"); } break; ????? /*第1次讀取IMEI*/ case MDM_TX1_ATGSN_CMD: LOG("\r\n*Step:%d,read IMEI\r\n", MDM_TX1_ATGSN_CMD); mdm_send_cmd_noack((u8*)"AT+GSN"); /*讀取IMEI*/ MDM_STA = MDM_WAIT1_ATGSN_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT1_ATGSN_RES:/*讀取IMEI*/ if(!mdm_check_str((u8*)"OK")) /*查詢到OK*/ { Str2BCD(USART1_RX_BUF, (u8*)temp1IMEI); MDM_STA = MDM_TX2_ATGSN_CMD; /*第2次讀取IMEI*/ LOG("-1-get IMEI ok\r\n"); } else if(gtimer.mdmFSMTimerout > 400) /*2s超時(shí)*/ { MDM_STA = MDM_TX_ATCIMI_CMD; LOG("-1-get IMEI error\r\n"); } break; /*第2次讀取IMEI*/ case MDM_TX2_ATGSN_CMD: LOG("\r\n*Step:%d,read IMEI\r\n", MDM_TX2_ATGSN_CMD); mdm_send_cmd_noack((u8*)"AT+GSN"); /*讀取IMEI*/ MDM_STA = MDM_WAIT2_ATGSN_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT2_ATGSN_RES:/*讀取IMEI*/ if(!mdm_check_str((u8*)"OK")) /*查詢到OK*/ { Str2BCD(USART1_RX_BUF, (u8*)temp2IMEI); MDM_STA = MDM_TX_ATCIMI_CMD; LOG("-2-get IMEI ok\r\n"); if(memcmp(&temp1IMEI[0], &temp2IMEI[0], sizeof(temp2IMEI)) == 0) /*兩次結(jié)果相等*/ { LOG("read 2 times same IMEI\r\n"); LOG("IMEI1:\r\n"); printfHex(temp1IMEI,sizeof(temp1IMEI)); LOG("IMEI2:\r\n"); printfHex(temp2IMEI,sizeof(temp2IMEI)); if(memcmp(&deviceInfo.deviceIMEI[0], &temp2IMEI[0], sizeof(temp2IMEI)) != 0)/*和舊IMEI比較*/ { memcpy(&deviceInfo.deviceIMEI[0], &temp2IMEI[0], sizeof(temp2IMEI)); writeFlash(); //保存參數(shù) LOG("updata IMEI ok\r\n"); } else { LOG("old IMEI ok\r\n"); } memset(temp1IMEI, 0x00, sizeof(temp1IMEI)); memset(temp2IMEI, 0x00, sizeof(temp2IMEI)); } else { LOG("read 2 times different IMEI\r\n"); } } else if(gtimer.mdmFSMTimerout > 400) /*2s超時(shí)*/ { MDM_STA = MDM_TX_ATCIMI_CMD; LOG("-2-get IMEI error\r\n"); } break; /*讀取IMSI*/ case MDM_TX_ATCIMI_CMD: /*讀取IMSI*/ LOG("\r\n*Step:%d,read IMSI\r\n", MDM_TX_ATCIMI_CMD); mdm_send_cmd_noack((u8*)"AT+CIMI"); MDM_STA = MDM_WAIT_ATCIMI_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCIMI_RES: if(!mdm_check_str((u8*)"OK")) /*查詢到OK*/ { char tmpIMSI[8]; Str2BCD(USART1_RX_BUF, (u8*)tmpIMSI); /*TBoxInfoType.deviceInfo.deviceIMSI*/ MDM_STA = MDM_GPRS_INTI; LOG("get IMSI:\r\n"); printfHex(tmpIMSI,sizeof(tmpIMSI)); if(memcmp(&TBoxInfoType.deviceInfo.deviceIMSI[0], &tmpIMSI[0], sizeof(tmpIMSI)) != 0)/*和舊數(shù)據(jù)比較*/ { memcpy(&TBoxInfoType.deviceInfo.deviceIMSI[0], &tmpIMSI[0], sizeof(tmpIMSI)); writeFlash(); //保存參數(shù) LOG("updata IMSI ok\r\n"); } else { LOG("old IMSI ok\r\n"); } memset(tmpIMSI, 0x00, sizeof(tmpIMSI)); } else if(gtimer.mdmFSMTimerout > 400) /*2s超時(shí)*/ { MDM_STA = MDM_GPRS_INTI; LOG("get IMSI error\r\n"); } break; /*GPRS配置*/ case MDM_GPRS_INTI: LOG("\r\n*Step:%d,MDM_GPRS_INTI\r\n", MDM_GPRS_INTI); MDM_STA = MDM_TX_ATE_CMD; break; case MDM_TX_ATE_CMD:/*開(kāi)關(guān)回顯*/ LOG("\r\n*Step:%d,%s\r\n", MDM_TX_ATE_CMD, ATEx); mdm_send_cmd_noack((u8*)ATEx); /*開(kāi)關(guān)回顯*/ MDM_STA = MDM_WAIT_ATE_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATE_RES: if(!mdm_check_str((u8*)"OK")) { MDM_STA = MDM_TX_ATCPIN_CMD; LOG("%s ok\r\n", ATEx); } else if(gtimer.mdmFSMTimerout > 200) /*1s超時(shí)*/ { MDM_STA = MDM_TX_ATCPIN_CMD; LOG("ATEx error\r\n"); } break; case MDM_TX_ATCPIN_CMD: /*非阻塞式,最大等待時(shí)長(zhǎng)5s*/ LOG("\r\n*Step:%d,AT+CPIN?\r\n", MDM_TX_ATCPIN_CMD); mdm_send_cmd_noack((u8*)"AT+CPIN?"); MDM_STA = MDM_WAIT_ATCPIN_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCPIN_RES: if(!mdm_check_str((u8*)"READY")) /*查詢*/ { MDM_STA = MDM_TX_ATCCID_CMD; LOG("AT+CPIN? ok\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATCPIN_MAX_TIME) /*超時(shí),最大5s*/ { MDM_STA = MDM_TX_ATCCID_CMD; /*next*/ gCnt.mdmTotalErr++; SIM_Handler();/*SIM卡故障*/ LOG("AT+CPIN? error\r\n"); } break; case MDM_TX_ATCCID_CMD: /*查詢SIM卡CCID*/ LOG("\r\n*Step:%d,read CCID\r\n", MDM_TX_ATCCID_CMD); mdm_send_cmd_noack((u8*)"AT+CCID"); MDM_STA = MDM_WAIT_ATCCID_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCCID_RES: if(!mdm_check_str((u8*)"+CCID:")) /*查詢*/ { char* tempCCID = NULL; u8 ccidSize = 21; tempCCID = (char*)malloc(sizeof(char)*ccidSize); memset(tempCCID, 0x00, ccidSize); memcpy(tempCCID, &USART1_RX_BUF[10], ccidSize);//保存CCID tempCCID[20] = '\0'; /*添加結(jié)束符*/ LOG("tmpCCID:%s\r\n", tempCCID); if(strstr((const char*)tempCCID, (const char*)"OK")== NULL) //無(wú)OK { if(strstr((const char*)tempCCID, (const char*)"\r\n")== NULL) //無(wú)回車換行 { memcpy(m6313Debug.ccid, tempCCID, ccidSize);//更新CCID m6313Debug.ccid[20] = '\0'; /*添加結(jié)束符*/ LOG("newCCID:%s\r\n", m6313Debug.ccid); } else { LOG("error\"OK\","); LOG("old CCID:%s\r\n", m6313Debug.ccid); } } else { LOG("error\"0x0A,0x0D\"\r\n"); LOG("old CCID:%s\r\n", m6313Debug.ccid); } free(tempCCID); MDM_STA = MDM_TX_ATCREG_CMD; } else if(gtimer.mdmFSMTimerout > WAIT_ATCCID_MAX_TIME) /*超時(shí),5s*/ { MDM_STA = MDM_TX_ATCREG_CMD; LOG("CCID get timeout! "); LOG("old CCID:%s\r\n", m6313Debug.ccid); } break; case MDM_TX_ATCREG_CMD: /*查詢2G網(wǎng)絡(luò)是否注冊(cè)*/ LOG("\r\n*Step:%d,AT+CREG?\r\n", MDM_TX_ATCREG_CMD); mdm_send_cmd_noack((u8*)"AT+CREG?"); MDM_STA = MDM_WAIT_ATCREG_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCREG_RES: if(!mdm_check_str((u8*)",1")) /*查詢,已注冊(cè)*/ { MDM_STA = MDM_TX_ATCSQ_CMD; LOG("AT+CREG? ok:1\r\n"); } else if(!mdm_check_str((u8*)",5")) /*查詢,漫游*/ { MDM_STA = MDM_TX_ATCSQ_CMD; LOG("AT+CREG? ok:5\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATCREG_MAX_TIME) /*超時(shí),3s*/ { USART1_RX_STA=0; MDM_STA = MDM_TX_ATCSQ_CMD; /*進(jìn)入下一步*/ LOG("AT+CREG? error\r\n"); } break; case MDM_TX_ATCSQ_CMD: /*查詢當(dāng)前信號(hào)質(zhì)量*/ LOG("\r\n*Step:%d,AT+CSQ\r\n", MDM_TX_ATCSQ_CMD); mdm_send_cmd_noack((u8*)"AT+CSQ"); MDM_STA = MDM_WAIT_ATCSQ_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATCSQ_RES: if(!mdm_check_str((u8*)"OK")) /*查詢*/ { u8 len;????????mdmInfo.signalIntensity?=?NMEA_Str2num(&USART1_RX_BUF[8],&len);?/*得到MDM的CSQ*/????????????????

MDM_STA = MDM_TX_ATQICLOSE_CMD; LOG("MDM_CSQ=%d\r\n", mdmInfo.signalIntensity); } else if(gtimer.mdmFSMTimerout > 200) /*1s超時(shí)*/??????{
MDM_STA = MDM_TX_ATQICLOSE_CMD; LOG("get CSQ error.\r\n"); } break; /*AT+QICLOSE關(guān)閉TCPUDP連接*/ case MDM_TX_ATQICLOSE_CMD: /*關(guān)閉PDP使用場(chǎng)景*/ LOG("\r\n*Step:%d,AT+QICLOSE\r\n", MDM_TX_ATQICLOSE_CMD); mdm_send_cmd_noack((u8*)"AT+QICLOSE"); MDM_STA = MDM_WAIT_ATQICLOSE_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQICLOSE_RES: if(!mdm_check_str((u8*)"ERROR")) /*關(guān)閉連接失敗*/ { MDM_STA = MDM_TX_ATQIDEACT_CMD; /*NEXT關(guān)閉PDP*/ LOG("AT+QICLOSE ok:\"ERROR\"\r\n"); } else if(!mdm_check_str((u8*)"CLOSE OK")) /*關(guān)閉連接成功*/ { MDM_STA = MDM_TX_ATQIDEACT_CMD; /*NEXT關(guān)閉PDP*/ LOG("AT+QICLOSE ok:\"CLOSE OK\"\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATQICLOSE_MAX_TIME) /*超時(shí),最大2s*/ { MDM_STA = MDM_TX_ATQIDEACT_CMD; /*NEXT關(guān)閉PDP*/ LOG("AT+QICLOSE error\r\n"); } break; /*AT+QIDEACT關(guān)閉PDP使用場(chǎng)景*/ case MDM_TX_ATQIDEACT_CMD: LOG("\r\n*Step:%d,AT+QIDEACT\r\n", MDM_TX_ATQIDEACT_CMD); mdm_send_cmd_noack((u8*)"AT+QIDEACT"); MDM_STA = MDM_WAIT_ATQIDEACT_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIDEACT_RES: if(!mdm_check_str((u8*)"ERROR")) /*查詢*/ { MDM_STA = MDM_TX_ATQIREGAPP_CMD; LOG("AT+QIDEACT ok:\"ERROR\"\r\n"); } else if(!mdm_check_str((u8*)"DEACT OK")) /*查詢*/ { MDM_STA = MDM_TX_ATQIREGAPP_CMD; LOG("AT+QIDEACT ok:\"DEACT OK\"\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATQIDEACT_MAX_TIME) /*超時(shí),最大45s*/ { MDM_STA = MDM_TX_ATQIREGAPP_CMD; LOG("AT+QIDEACT error\r\n"); } break; case MDM_TX_ATQIREGAPP_CMD: /*設(shè)置GPRS的APN(配置為 SIM卡簽約對(duì)應(yīng)的APN)*/ LOG("\r\n*Step:%d,AT+QIREGAPP\r\n", MDM_TX_ATQIREGAPP_CMD); mdm_send_cmd_noack((u8*)"AT+QIREGAPP=\"CMNET\""); MDM_STA = MDM_WAIT_ATQIREGAPP_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIREGAPP_RES: if(!mdm_check_str((u8*)"OK")) /*查詢*/ { MDM_STA = MDM_START_ATQIACT_CMD; LOG("AT+QIREGAPP ok\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATQIREGAPP_MAX_TIME) /*超時(shí),3s*/ { MDM_STA = MDM_START_ATQIACT_CMD; /*NEXT*/ LOG("AT+QIREGAPP error\r\n"); } break;
case MDM_START_ATQIACT_CMD: /*開(kāi)始激活PDP*/ LOG("\r\n*Step:%d,MDM_START_ATQIACT_CMD\r\n", MDM_START_ATQIACT_CMD); iTimes = 0; MDM_STA = MDM_TX_ATQIACT_CMD; break; case MDM_TX_ATQIACT_CMD: /*激活PDP,GPRS網(wǎng)絡(luò)*/ LOG("\r\n*step:%d,AT+QIACT\r\n", MDM_TX_ATQIACT_CMD); mdm_send_cmd_noack((u8*)"AT+QIACT"); iTimes++; LOG("AT+QIACT,count-%d-!\r\n", iTimes); gtimer.mdmFSMTimerout = 0; MDM_STA = MDM_WAIT_ATQIACT_RES; break; case MDM_WAIT_ATQIACT_RES: if(!mdm_check_str((u8*)"OK")) /*查詢到OK*/ { MDM_STA = MDM_START_TCP_SETUP; LOG("AT+QIACT-OK[%d]\r\n", iTimes); } else if(gtimer.mdmFSMTimerout > WAIT_ATQIACT_MAX_TIME) /*10秒超時(shí)*/ { if(iTimes < EXE_ATQIACT_TIMES) { MDM_STA = MDM_TX_ATQIACT_CMD; /*繼續(xù)激活PDP*/ LOG(".AT+QIACT,Continue-%d-!\r\n", iTimes); } else /*iTimes超過(guò)次數(shù)*/ { iTimes = 0; MDM_STA = MDM_START_TCP_SETUP; /*NEXT*/ LOG("AT+QIACT,%d times PDP active error\r\n", EXE_ATQIACT_TIMES); } } break; /*建立TCP連接*/ case MDM_START_TCP_SETUP: LOG("\r\n*Step:%d,MDM_START_TCP_SETUP\r\n", MDM_START_TCP_SETUP); MDM_STA = MDM_TX_ATQIMUX_CMD; break; case MDM_TX_ATQIMUX_CMD: /*配置單路連接*/ LOG("\r\n*Step:%d,AT+QIMUX\r\n", MDM_TX_ATQIMUX_CMD); mdm_send_cmd_noack((u8*)"AT+QIMUX=0"); MDM_STA = MDM_WAIT_ATQIMUX_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIMUX_RES: if(!mdm_check_str((u8*)"OK")) /*查詢*/ { MDM_STA = MDM_TX_ATQIMODE_CMD; LOG("AT+QIMUX ok\r\n"); } else if(gtimer.mdmFSMTimerout > 200) /*超時(shí),1s*/ { MDM_STA = MDM_TX_ATQIMODE_CMD; /*NEXT*/ LOG("AT+QIMUX error\r\n"); } break; case MDM_TX_ATQIMODE_CMD: /*配置非透?jìng)髂J?/ LOG("\r\n*Step:%d,AT+QIMODE\r\n", MDM_TX_ATQIMODE_CMD); mdm_send_cmd_noack((u8*)"AT+QIMODE=0"); /*非透?jìng)?/ MDM_STA = MDM_WAIT_ATQIMODE_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIMODE_RES: if(!mdm_check_str((u8*)"OK")) /*查詢*/ { MDM_STA = MDM_TX_ATQIDNSIP_CMD; LOG("AT+QIMODE ok\r\n"); } else if(gtimer.mdmFSMTimerout > 200) /*超時(shí),1s*/ { MDM_STA = MDM_TX_ATQIDNSIP_CMD; /*NEXT*/ LOG("AT+QIMODE error\r\n"); } break; case MDM_TX_ATQIDNSIP_CMD: /*使用域名訪問(wèn)*/ LOG("\r\n*Step:%d,AT+QIDNSIP\r\n", MDM_TX_ATQIDNSIP_CMD); mdm_send_cmd_noack((u8*)"AT+QIDNSIP=1"); /*非透?jìng)?/ MDM_STA = MDM_WAIT_ATQIDNSIP_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIDNSIP_RES: if(!mdm_check_str((u8*)"OK")) /*查詢*/ { MDM_STA = MDM_START_ATQIOPEN_CMD; /*NEXT*/ LOG("AT+QIDNSIP ok\r\n"); } else if(gtimer.mdmFSMTimerout > 400) /*超時(shí)2s*/ { MDM_STA = MDM_START_ATQIOPEN_CMD; /*NEXT*/ LOG("AT+QIDNSIP error\r\n"); } break; case MDM_START_ATQIOPEN_CMD: /*開(kāi)始TCP連接*/ LOG("\r\n*Step:%d,MDM_START_ATQIOPEN_CMD\r\n", MDM_START_ATQIOPEN_CMD); iTimes = 0; MDM_STA = MDM_TX_ATQIOPEN_CMD; break; case MDM_TX_ATQIOPEN_CMD: LOG("\r\n*Step:%d,AT+QIOPEN\r\n", MDM_TX_ATQIOPEN_CMD); if(devParam.secondTcp.addr[0] !=0)/*聯(lián)網(wǎng)IP選擇*/ { TCP_Conncect(devParam.secondTcp.addr,devParam.secondTcp.port); } else{ TCP_Conncect(IPaddr,IPport);}
iTimes++; LOG("send\"AT+QIOPEN\",count-%d-\r\n", iTimes); MDM_STA = MDM_WAIT_ATQIOPEN_RES; gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_ATQIOPEN_RES: if(!mdm_check_str((u8*)"CONNECT OK")) /*查詢CONNECT*/ { MDM_STA = MDM_WAIT_TCPSEND_CMD; /*TCP建立成功,進(jìn)入空閑狀態(tài)*/ LOG(".get\"CONNECT OK\"\r\n"); } else if(!mdm_check_str((u8*)"ALREAY CONNECT")) { MDM_STA = MDM_WAIT_TCPSEND_CMD; /*TCP建立成功,進(jìn)入空閑狀態(tài)*/ LOG(".get\"ALREAY CONNECT\"\r\n"); } else if(gtimer.mdmFSMTimerout > WAIT_ATQIOPEN_MAX_TIME) /*超時(shí),30s*/ { LOG("count-%d-,MDM_FSM timeout!\r\n", iTimes); if(iTimes < EXE_ATQIOPEN_TIMES) { MDM_STA = MDM_TX_ATQIOPEN_CMD; /*繼續(xù)建立TCP*/ LOG(".continue AT+QIOPEN!\r\n"); } else /*iTimes超過(guò)次數(shù)*/ { iTimes = 0; MDM_STA = MDM_IDLE_STA; /*中斷*/ STOP_MDM_FSM(); /*MDM_FSM結(jié)束*/ cntMdm = 0; /*MDM連網(wǎng)失敗*/ gCnt.mdmTotalErr++; //MDM錯(cuò)誤統(tǒng)計(jì) LOG("AT+QIOPEN:%d times exe error,TCP connect fail!\r\n",EXE_ATQIOPEN_TIMES); } } break; /*進(jìn)行延時(shí)發(fā)送任務(wù)*/ case MDM_WAIT_TCPSEND_CMD: MDM_STA = MDM_WAIT_TCPSEND_RES; /*TCP建立成功,進(jìn)入等待發(fā)送任務(wù)*/ LOG("MDM_FSM:TCP connect suc!\r\n"); gtimer.mdmFSMTimerout = 0; break; case MDM_WAIT_TCPSEND_RES: if(gtimer.mdmFSMTimerout > 400) /*等待兩秒*/ { MDM_STA = MDM_IDLE_STA; /*TCP建立成功,進(jìn)入空閑狀態(tài)*/ MDM_NET_CONNECT_OK_HANDLE(); STOP_MDM_FSM(); /*MDM_FSM結(jié)束*/ } break;
default: break; }}




?這就是我分享的2G網(wǎng)絡(luò)模塊聯(lián)網(wǎng)的過(guò)程哈,里面代碼是實(shí)踐過(guò)的,如果大家有什么更好的思路,歡迎分享交流哈。




更多分享,掃碼關(guān)注我





免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉