|
|
最近學(xué)習(xí)SD卡讀寫知識(shí),又牽涉到USART函數(shù),對(duì)于結(jié)構(gòu)體定義和函數(shù)調(diào)用知識(shí)匱乏。
研究了三天還沒有眉目。原子的例程是由深入淺,看起來比較吃力,原來學(xué)習(xí)51系列單片機(jī)
都是由淺入深,先點(diǎn)亮一個(gè)LED,再學(xué)習(xí)輸入的定義和操作。看來還得慢慢摸索啊。
- #include "usmart.h"
- #include "usart.h"
- #include "sys.h"
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
- //ALIENTEK STM32開發(fā)板
- //正點(diǎn)原子@ALIENTEK
- //All rights reserved
- //********************************************************************************
- //升級(jí)說明
- //V1.4
- //增加了對(duì)參數(shù)為string類型的函數(shù)的支持.適用范圍大大提高.
- //優(yōu)化了內(nèi)存占用,靜態(tài)內(nèi)存占用為79個(gè)字節(jié)@10個(gè)參數(shù).動(dòng)態(tài)適應(yīng)數(shù)字及字符串長度
- //V2.0
- //1,修改了list指令,打印函數(shù)的完整表達(dá)式.
- //2,增加了id指令,打印每個(gè)函數(shù)的入口地址.
- //3,修改了參數(shù)匹配,支持函數(shù)參數(shù)的調(diào)用(輸入入口地址).
- //4,增加了函數(shù)名長度宏定義.
- //V2.1 20110707
- //1,增加dec,hex兩個(gè)指令,用于設(shè)置參數(shù)顯示進(jìn)制,及執(zhí)行進(jìn)制轉(zhuǎn)換.
- //注:當(dāng)dec,hex不帶參數(shù)的時(shí)候,即設(shè)定顯示參數(shù)進(jìn)制.當(dāng)后跟參數(shù)的時(shí)候,即執(zhí)行進(jìn)制轉(zhuǎn)換.
- //如:"dec 0XFF" 則會(huì)將0XFF轉(zhuǎn)為255,由串口返回.
- //如:"hex 100" 則會(huì)將100轉(zhuǎn)為0X64,由串口返回
- //2,新增usmart_get_cmdname函數(shù),用于獲取指令名字.
- //V2.2 20110726
- //1,修正了void類型參數(shù)的參數(shù)統(tǒng)計(jì)錯(cuò)誤.
- //2,修改數(shù)據(jù)顯示格式默認(rèn)為16進(jìn)制.
- //V2.3 20110815
- //1,去掉了函數(shù)名后必須跟"("的限制.
- //2,修正了字符串參數(shù)中不能有"("的bug.
- //3,修改了函數(shù)默認(rèn)顯示參數(shù)格式的修改方式.
- //V2.4 20110905
- //1,修改了usmart_get_cmdname函數(shù),增加最大參數(shù)長度限制.避免了輸入錯(cuò)誤參數(shù)時(shí)的死機(jī)現(xiàn)象.
- //2,增加USMART_ENTIM_SCAN宏定義,用于配置是否使用TIM定時(shí)執(zhí)行scan函數(shù).
- //V2.5 20110930
- //1,修改usmart_init函數(shù)為void usmart_init(u8 sysclk),可以根據(jù)系統(tǒng)頻率自動(dòng)設(shè)定掃描時(shí)間.(固定100ms)
- //2,去掉了usmart_init函數(shù)中的uart_init函數(shù),串口初始化必須在外部初始化,方便用戶自行管理.
- //V2.6 20111009
- //1,增加了read_addr和write_addr兩個(gè)函數(shù).可以利用這兩個(gè)函數(shù)讀寫內(nèi)部任意地址(必須是有效地址).更加方便調(diào)試.
- //2,read_addr和write_addr兩個(gè)函數(shù)可以通過設(shè)置USMART_USE_WRFUNS為來使能和關(guān)閉.
- //3,修改了usmart_strcmp,使其規(guī)范化.
- //V2.7 20111024
- //1,修正了返回值16進(jìn)制顯示時(shí)不換行的bug.
- //2,增加了函數(shù)是否有返回值的判斷,如果沒有返回值,則不會(huì)顯示.有返回值時(shí)才顯示其返回值.
- //V2.8 20111116
- //1,修正了list等不帶參數(shù)的指令發(fā)送后可能導(dǎo)致死機(jī)的bug.
- //V2.9 20120917
- //1,修改了形如:void*xxx(void)類型函數(shù)不能識(shí)別的bug。
- //V3.0 20130425
- //1,新增了字符串參數(shù)對(duì)轉(zhuǎn)義符的支持。
- //V3.1 20131120
- //1,增加runtime系統(tǒng)指令,可以用于統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間.
- //用法:
- //發(fā)送:runtime 1 ,則開啟函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)功能
- //發(fā)送:runtime 0 ,則關(guān)閉函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)功能
- ///runtime統(tǒng)計(jì)功能,必須設(shè)置:USMART_ENTIMX_SCAN 為1,才可以使用!!
- /////////////////////////////////////////////////////////////////////////////////////
- //USMART資源占用情況@MDK [url=mailto:3.80A@2.0]3.80A@2.0[/url]版本:
- //FLASH:4K~K字節(jié)(通過USMART_USE_HELP和USMART_USE_WRFUNS設(shè)置)
- //SRAM:72字節(jié)(最少的情況下)
- //SRAM計(jì)算公式: SRAM=PARM_LEN+72-4 其中PARM_LEN必須大于等于4.
- //應(yīng)該保證堆棧不小于100個(gè)字節(jié).
- ////////////////////////////////////////////用戶配置參數(shù)////////////////////////////////////////////////////
- //系統(tǒng)命令
- u8 *sys_cmd_tab[]=
- {
- "?",
- "help",
- "list",
- "id",
- "hex",
- "dec",
- "runtime",
- };
- //處理系統(tǒng)指令
- //0,成功處理;其他,錯(cuò)誤代碼;
- u8 usmart_sys_cmd_exe(u8 *str)
- {
- u8 i;
- u8 sfname[MAX_FNAME_LEN]; //存放本地函數(shù)名
- u8 pnum;
- u8 rval;
- u32 res;
- res=usmart_get_cmdname(str,sfname,&i,MAX_FNAME_LEN); //得到指令及指令長度
- if(res)return USMART_FUNCERR; //錯(cuò)誤的指令
- str+=i;
- for(i=0;i<sizeof(sys_cmd_tab)/4;i++) //支持的系統(tǒng)指令
- {
- if(usmart_strcmp(sfname,sys_cmd_tab[i])==0)break;
- }
- switch(i)
- {
- case 0:
- case 1: //幫助指令
- printf("\r\n");
- #if USMART_USE_HELP
- printf("------------------------USMART V3.1------------------------ \r\n");
- printf(" USMART是由ALIENTEK開發(fā)的一個(gè)靈巧的串口調(diào)試互交組件,通過 \r\n");
- printf("它,你可以通過串口助手調(diào)用程序里面的任何函數(shù),并執(zhí)行.因此,你可\r\n");
- printf("以隨意更改函數(shù)的輸入?yún)?shù)(支持?jǐn)?shù)字(10/16進(jìn)制)、字符串、函數(shù)入\r\n");
- printf("口地址等作為參數(shù)),單個(gè)函數(shù)最多支持10個(gè)輸入?yún)?shù),并支持函數(shù)返 \r\n");
- printf("回值顯示.新增參數(shù)顯示進(jìn)制設(shè)置功能,新增進(jìn)制轉(zhuǎn)換功能.\r\n");
- printf("技術(shù)支持:[url=http://www.openedv.com]www.openedv.com[/url]\r\n");
- printf("USMART有7個(gè)系統(tǒng)命令:\r\n");
- printf("?: 獲取幫助信息\r\n");
- printf("help: 獲取幫助信息\r\n");
- printf("list: 可用的函數(shù)列表\r\n\n");
- printf("id: 可用函數(shù)的ID列表\r\n\n");
- printf("hex: 參數(shù)16進(jìn)制顯示,后跟空格+數(shù)字即執(zhí)行進(jìn)制轉(zhuǎn)換\r\n\n");
- printf("dec: 參數(shù)10進(jìn)制顯示,后跟空格+數(shù)字即執(zhí)行進(jìn)制轉(zhuǎn)換\r\n\n");
- printf("runtime:1,開啟函數(shù)運(yùn)行計(jì)時(shí);0,關(guān)閉函數(shù)運(yùn)行計(jì)時(shí);\r\n\n");
- printf("請(qǐng)按照程序編寫格式輸入函數(shù)名及參數(shù)并以回車鍵結(jié)束.\r\n");
- printf("--------------------------ALIENTEK------------------------- \r\n");
- #else
- printf("指令失效\r\n");
- #endif
- break;
- case 2: //查詢指令
- printf("\r\n");
- printf("-------------------------函數(shù)清單--------------------------- \r\n");
- for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name);
- printf("\r\n");
- break;
- case 3: //查詢ID
- printf("\r\n");
- printf("-------------------------函數(shù) ID --------------------------- \r\n");
- for(i=0;i<usmart_dev.fnum;i++)
- {
- usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum,&rval); //得到本地函數(shù)名
- printf("%s id is:\r\n0X%08X\r\n",sfname,usmart_dev.funs[i].func); //顯示ID
- }
- printf("\r\n");
- break;
- case 4: //hex指令
- printf("\r\n");
- usmart_get_aparm(str,sfname,&i);
- if(i==0) //參數(shù)正常
- {
- i=usmart_str2num(sfname,&res); //記錄該參數(shù)
- if(i==0) //進(jìn)制轉(zhuǎn)換功能
- {
- printf("HEX:0X%X\r\n",res); //轉(zhuǎn)為16進(jìn)制
- }
- else if(i!=4)
- return USMART_PARMERR; //參數(shù)錯(cuò)誤.
- else //參數(shù)顯示設(shè)定功能
- {
- printf("16進(jìn)制參數(shù)顯示!\r\n");
- usmart_dev.sptype=SP_TYPE_HEX;
- }
- }
- else return USMART_PARMERR; //參數(shù)錯(cuò)誤.
- printf("\r\n");
- break;
- case 5: //dec指令
- printf("\r\n");
- usmart_get_aparm(str,sfname,&i);
- if(i==0) //參數(shù)正常
- {
- i=usmart_str2num(sfname,&res); //記錄該參數(shù)
- if(i==0) //進(jìn)制轉(zhuǎn)換功能
- {
- printf("DEC:%lu\r\n",res); //轉(zhuǎn)為10進(jìn)制
- }else if(i!=4)return USMART_PARMERR; //參數(shù)錯(cuò)誤.
- else //參數(shù)顯示設(shè)定功能
- {
- printf("10進(jìn)制參數(shù)顯示!\r\n");
- usmart_dev.sptype=SP_TYPE_DEC;
- }
- }else return USMART_PARMERR; //參數(shù)錯(cuò)誤.
- printf("\r\n");
- break;
- case 6: //runtime指令,設(shè)置是否顯示函數(shù)執(zhí)行時(shí)間
- printf("\r\n");
- usmart_get_aparm(str,sfname,&i);
- if(i==0) //參數(shù)正常
- {
- i=usmart_str2num(sfname,&res); //記錄該參數(shù)
- if(i==0) //讀取指定地址數(shù)據(jù)功能
- {
- if(USMART_ENTIMX_SCAN==0)printf("\r\nError! \r\nTo EN RunTime function,Please set USMART_ENTIMX_SCAN = 1 first!\r\n");//報(bào)錯(cuò)
- else
- {
- usmart_dev.runtimeflag=res;
- if(usmart_dev.runtimeflag)printf("Run Time Calculation ON\r\n");
- else printf("Run Time Calculation OFF\r\n");
- }
- }else return USMART_PARMERR; //未帶參數(shù),或者參數(shù)錯(cuò)誤
- }else return USMART_PARMERR; //參數(shù)錯(cuò)誤.
- printf("\r\n");
- break;
- default: //非法指令
- return USMART_FUNCERR;
- }
- return 0;
- }
- ////////////////////////////////////////////////////////////////////////////////////////
- //移植注意:本例是以stm32為例,如果要移植到其他mcu,請(qǐng)做相應(yīng)修改.
- //usmart_reset_runtime,清除函數(shù)運(yùn)行時(shí)間,連同定時(shí)器的計(jì)數(shù)寄存器以及標(biāo)志位一起清零.并設(shè)置重裝載值為最大,以最大限度的延長計(jì)時(shí)時(shí)間.
- //usmart_get_runtime,獲取函數(shù)運(yùn)行時(shí)間,通過讀取CNT值獲取,由于usmart是通過中斷調(diào)用的函數(shù),所以定時(shí)器中斷不再有效,此時(shí)最大限度
- //只能統(tǒng)計(jì)2次CNT的值,也就是清零后+溢出一次,當(dāng)溢出超過2次,沒法處理,所以最大延時(shí),控制在:2*計(jì)數(shù)器CNT*0.1ms.對(duì)STM32來說,是:13.1s左右
- //其他的:TIM4_IRQHandler和Timer4_Init,需要根據(jù)MCU特點(diǎn)自行修改.確保計(jì)數(shù)器計(jì)數(shù)頻率為:10Khz即可.另外,定時(shí)器不要開啟自動(dòng)重裝載功能!!
- #if USMART_ENTIMX_SCAN==1
- /***********************************************************/
- /***********************復(fù)位runtime*************************/
- void usmart_reset_runtime(void) //需要根據(jù)所移植到的MCU的定時(shí)器參數(shù)進(jìn)行修改
- {
- TIM4->SR&=~(1<<0); //清除中斷標(biāo)志位
- TIM4->ARR=0XFFFF; //將重裝載值設(shè)置到最大
- TIM4->CNT=0; //清空定時(shí)器的CNT
- usmart_dev.runtime=0;
- }
- /******** 獲得runtime時(shí)間 **********************************/
- /* 返回值:執(zhí)行時(shí)間,單位:0.1ms,最大延時(shí)時(shí)間為定時(shí)器CNT值的2倍*0.1ms */
- /* 需要根據(jù)所移植到的MCU的定時(shí)器參數(shù)進(jìn)行修改 ***********************/
- u32 usmart_get_runtime(void)
- {
- if(TIM4->SR&0X0001) //在運(yùn)行期間,產(chǎn)生了定時(shí)器溢出
- {
- usmart_dev.runtime+=0XFFFF;
- }
- usmart_dev.runtime+=TIM4->CNT;
- return usmart_dev.runtime; //返回計(jì)數(shù)值
- }
- /**** 下面這兩個(gè)函數(shù),非USMART函數(shù),放到這里,僅僅方便移植. ******/
- /**** 定時(shí)器4中斷服務(wù)程序 ***********************************/
- void TIM4_IRQHandler(void)
- {
- if(TIM4->SR&0X0001) //溢出中斷
- {
- usmart_dev.scan(); //執(zhí)行usmart掃描
- TIM4->CNT=0; //清空定時(shí)器的CNT
- TIM4->ARR=1000; //恢復(fù)原來的設(shè)置
- }
- TIM4->SR&=~(1<<0); //清除中斷標(biāo)志位
- }
- /***************** 使能定時(shí)器4,使能中斷. ********************/
- void Timer4_Init(u16 arr,u16 psc)
- {
- RCC->APB1ENR|=1<<2; //TIM4時(shí)鐘使能
- TIM4->ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
- TIM4->PSC=psc; //預(yù)分頻器7200,得到10Khz的計(jì)數(shù)時(shí)鐘
- TIM4->DIER|=1<<0; //允許更新中斷
- TIM4->CR1|=0x01; //使能定時(shí)器2
- MY_NVIC_Init(3,3,TIM4_IRQn,2); //搶占3,子優(yōu)先級(jí)3,組2(組2中優(yōu)先級(jí)最低
- }
- #endif
- /************** 初始化串口控制器 ****************************/
- /************** sysclk:系統(tǒng)時(shí)鐘(Mhz)***********************/
- void usmart_init(u8 sysclk)
- {
- #if USMART_ENTIMX_SCAN==1
- Timer4_Init(1000,(u32)sysclk*100-1); //分頻,時(shí)鐘為10K ,100ms中斷一次,注意,計(jì)數(shù)頻率必須為10Khz,以和runtime單位(0.1ms)同步.
- #endif
- usmart_dev.sptype=1; //十六進(jìn)制顯示參數(shù)
- }
- /********* 從str中獲取函數(shù)名,id,及參數(shù)信息 *******************/
- /********* *str:字符串指針. *********************************/
- /********* 返回值:0,識(shí)別成功;其他,錯(cuò)誤代碼. ******************/
- u8 usmart_cmd_rec(u8*str)
- {
- u8 sta,i,rval; //狀態(tài)
- u8 rpnum,spnum;
- u8 rfname[MAX_FNAME_LEN]; //暫存空間,用于存放接收到的函數(shù)名
- u8 sfname[MAX_FNAME_LEN]; //存放本地函數(shù)名
- sta=usmart_get_fname(str,rfname,&rpnum,&rval); //得到接收到的數(shù)據(jù)的函數(shù)名及參數(shù)個(gè)數(shù)
- if(sta)return sta; //錯(cuò)誤
- for(i=0;i<usmart_dev.fnum;i++)
- {
- sta=usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&spnum,&rval); //得到本地函數(shù)名及參數(shù)個(gè)數(shù)
- if(sta)return sta; //本地解析有誤
- if(usmart_strcmp(sfname,rfname)==0) //相等
- {
- if(spnum>rpnum)return USMART_PARMERR; //參數(shù)錯(cuò)誤(輸入?yún)?shù)比源函數(shù)參數(shù)少)
- usmart_dev.id=i; //記錄函數(shù)ID.
- break; //跳出.
- }
- }
- if(i==usmart_dev.fnum)return USMART_NOFUNCFIND; //未找到匹配的函數(shù)
- sta=usmart_get_fparam(str,&i); //得到函數(shù)參數(shù)個(gè)數(shù)
- if(sta)return sta; //返回錯(cuò)誤
- usmart_dev.pnum=i; //參數(shù)個(gè)數(shù)記錄
- return USMART_OK;
- }
- //usamrt執(zhí)行函數(shù)
- //該函數(shù)用于最終執(zhí)行從串口收到的有效函數(shù).
- //最多支持10個(gè)參數(shù)的函數(shù),更多的參數(shù)支持也很容易實(shí)現(xiàn).不過用的很少.一般5個(gè)左右的參數(shù)的函數(shù)已經(jīng)很少見了.
- //該函數(shù)會(huì)在串口打印執(zhí)行情況.以:"函數(shù)名(參數(shù)1,參數(shù)2...參數(shù)N)=返回值".的形式打印.
- //當(dāng)所執(zhí)行的函數(shù)沒有返回值的時(shí)候,所打印的返回值是一個(gè)無意義的數(shù)據(jù).
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void usmart_exe(void)
- {
- u8 id,i;
- u32 res=0;
- u32 temp[MAX_PARM]; //參數(shù)轉(zhuǎn)換,使之支持了字符串
- u8 sfname[MAX_FNAME_LEN]; //存放本地函數(shù)名
- u8 pnum,rval;
- id=usmart_dev.id;
- if(id>=usmart_dev.fnum)return; //不執(zhí)行.
- usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum,&rval); //得到本地函數(shù)名,及參數(shù)個(gè)數(shù)
- printf("\r\n%s(",sfname); //輸出正要執(zhí)行的函數(shù)名
- for(i=0;i<pnum;i++) //輸出參數(shù)
- {
- if(usmart_dev.parmtype&(1<<i)) //參數(shù)是字符串
- {
- printf("%c",'"');
- printf("%s",usmart_dev.parm+usmart_get_parmpos(i));
- printf("%c",'"');
- temp[i]=(u32)&(usmart_dev.parm[usmart_get_parmpos(i)]);
- }
- else //參數(shù)是數(shù)字
- {
- temp[i]=*(u32*)(usmart_dev.parm+usmart_get_parmpos(i));
- if(usmart_dev.sptype==SP_TYPE_DEC)printf("%lu",temp[i]); //10進(jìn)制參數(shù)顯示
- else printf("0X%X",temp[i]); //16進(jìn)制參數(shù)顯示
- }
- if(i!=pnum-1)printf(",");
- }
- printf(")");
- usmart_reset_runtime(); //計(jì)時(shí)器清零,開始計(jì)時(shí)
- switch(usmart_dev.pnum)
- {
- case 0: //無參數(shù)(void類型)
- res=(*(u32(*)())usmart_dev.funs[id].func)();
- break;
- case 1: //有1個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
- break;
- case 2: //有2個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);
- break;
- case 3: //有3個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2]);
- break;
- case 4: //有4個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3]);
- break;
- case 5: //有5個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4]);
- break;
- case 6: //有6個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
- temp[5]);
- break;
- case 7: //有7個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
- temp[5],temp[6]);
- break;
- case 8: //有8個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
- temp[5],temp[6],temp[7]);
- break;
- case 9: //有9個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
- temp[5],temp[6],temp[7],temp[8]);
- break;
- case 10: //有10個(gè)參數(shù)
- res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
- temp[5],temp[6],temp[7],temp[8],temp[9]);
- break;
- }
- usmart_get_runtime(); //獲取函數(shù)執(zhí)行時(shí)間
- if(rval==1) //需要返回值.
- {
- if(usmart_dev.sptype==SP_TYPE_DEC)printf("=%lu;\r\n",res); //輸出執(zhí)行結(jié)果(10進(jìn)制參數(shù)顯示)
- else printf("=0X%X;\r\n",res); //輸出執(zhí)行結(jié)果(16進(jìn)制參數(shù)顯示)
- }else printf(";\r\n"); //不需要返回值,直接輸出結(jié)束
- if(usmart_dev.runtimeflag) //需要顯示函數(shù)執(zhí)行時(shí)間
- {
- printf("Function Run Time:%d.%1dms\r\n",usmart_dev.runtime/10,usmart_dev.runtime%10);//打印函數(shù)執(zhí)行時(shí)間
- }
- }
- /******************* usmart掃描函數(shù) *********************************/
- /* 通過調(diào)用該函數(shù),實(shí)現(xiàn)usmart的各個(gè)控制.該函數(shù)需要每隔一定時(shí)間被調(diào)用一次 */
- /* 以及時(shí)執(zhí)行從串口發(fā)過來的各個(gè)函數(shù). **********************************/
- /* 本函數(shù)可以在中斷里面調(diào)用,從而實(shí)現(xiàn)自動(dòng)管理. **************************/
- /* 如果非ALIENTEK用戶,則USART_RX_STA和USART_RX_BUF[]需要用戶自己實(shí)現(xiàn) **/
- void usmart_scan(void)
- {
- u8 sta,len;
- if(USART_RX_STA&0x8000) //串口接收完成?
- {
- len=USART_RX_STA&0x3fff; //得到此次接收到的數(shù)據(jù)長度
- USART_RX_BUF[len]='\0'; //在末尾加入結(jié)束符.
- sta=usmart_dev.cmd_rec(USART_RX_BUF); //得到函數(shù)各個(gè)信息
- if(sta==0)usmart_dev.exe(); //執(zhí)行函數(shù)
- else
- {
- len=usmart_sys_cmd_exe(USART_RX_BUF);
- if(len!=USMART_FUNCERR)sta=len;
- if(sta)
- {
- switch(sta)
- {
- case USMART_FUNCERR:
- printf("函數(shù)錯(cuò)誤!\r\n");
- break;
- case USMART_PARMERR:
- printf("參數(shù)錯(cuò)誤!\r\n");
- break;
- case USMART_PARMOVER:
- printf("參數(shù)太多!\r\n");
- break;
- case USMART_NOFUNCFIND:
- printf("未找到匹配的函數(shù)!\r\n");
- break;
- }
- }
- }
- USART_RX_STA=0; //狀態(tài)寄存器清空
- }
- }
- #if USMART_USE_WRFUNS==1 //如果使能了讀寫操作
- /********************* 讀取指定地址的值 *********************/
- u32 read_addr(u32 addr)
- {
- return *(u32*)addr;//
- }
- /******************** 在指定地址寫入指定的值 *****************/
- void write_addr(u32 addr,u32 val)
- {
- *(u32*)addr=val;
- }
- #endif
復(fù)制代碼
|
|