亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usmart.c

?? ALIENTEK MINISTM32 擴展實驗9 USMART應用
?? C
字號:
#include "usmart.h"
#include "usart.h"
#include "timer.h"	    
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK STM32開發板	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2011/6/13
//版本:V2.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2011-2021
//All rights reserved
//********************************************************************************
//升級說明
//V1.4
//增加了對參數為string類型的函數的支持.適用范圍大大提高.
//優化了內存占用,靜態內存占用為79個字節@10個參數.動態適應數字及字符串長度
//V2.0,
//1,修改了list指令,打印函數的完整表達式.
//2,增加了id指令,打印每個函數的入口地址.
//3,修改了參數匹配,支持函數參數的調用(輸入入口地址).
//4,增加了函數名長度宏定義.			  
/////////////////////////////////////////////////////////////////////////////////////
//系統命令
u8 *sys_cmd_tab[]=
{
	"?",
	"help",
	"list",
	"id",
};	    
//處理系統指令
//0,成功處理;其他,錯誤代碼;
u8 usmart_sys_cmd_exe(u8 *str)
{
	u8 i;
	u8 sfname[MAX_FNAME_LEN];//存放本地函數名
	u8 pnum;
	for(i=0;i<4;i++)//支持4個系統指令
	{
		if(usmart_strcmp(str,sys_cmd_tab[i]))break;
	}				    
	switch(i)
	{					   
		case 0:
		case 1://幫助指令
			printf("\r\n");
#if USMART_USE_HELP
			printf("------------------------USMART V2.0------------------------ \r\n");
			printf("    USMART是由ALIENTEK開發的一個靈巧的串口調試互交組件,通過 \r\n");
			printf("它,你可以通過串口助手調用程序里面的任何函數,并執行.因此,你可\r\n");
			printf("以隨意更改函數的輸入參數(支持數字(10/16進制)、字符串、函數入\r\n");	  
			printf("口地址等作為參數),單個函數最多支持10個輸入參數,并支持函數返 \r\n");
			printf("回值顯示.  技術支持:www.openedv.com\r\n");
			printf("USMART有4個系統命令:\r\n");
			printf("?:    獲取幫助信息\r\n");
			printf("help: 獲取幫助信息\r\n");
			printf("list: 可用的函數列表\r\n\n");
			printf("id:   可用函數的ID列表\r\n\n");
			printf("請按照程序編寫格式輸入函數名及參數并以回車鍵結束.\r\n");    
			printf("--------------------------ALIENTEK------------------------- \r\n");
#else
			printf("指令失效\r\n");
#endif
			break;
		case 2://查詢指令
			printf("\r\n");
			printf("-------------------------函數清單--------------------------- \r\n");
			for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name);
			printf("\r\n\n");
			break;	 
		case 3://查詢ID
			printf("\r\n");
			printf("-------------------------函數 ID --------------------------- \r\n");
			for(i=0;i<usmart_dev.fnum;i++)
			{
				usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum);//得到本地函數名 
				printf("%s id is:\r\n0x%08x\r\n",sfname,usmart_dev.funs[i].func); //顯示ID
			}
			printf("\r\n\n");
			break;	 
		  
		default://非法指令
			return 1;
	}
	return 0;
}
//初始化串口控制器
void usmart_init(void)
{
	//必須使能串口中斷接收
	uart_init(72,9600); 	//串口1初始化 
	Timer2_Init(1000,7199);	//7200分頻,時鐘為10K ,100ms中斷一次
}		
//從str中獲取函數名,id,及參數信息
//*str:字符串指針.
//返回值:0,識別成功;其他,錯誤代碼.
u8 usmart_cmd_rec(u8*str) 
{
	u8 sta,i;//狀態	 
	u8 rpnum,spnum;
	u8 rfname[MAX_FNAME_LEN];//暫存空間,用于存放接收到的函數名  
	u8 sfname[MAX_FNAME_LEN];//存放本地函數名
	sta=usmart_get_fname(str,rfname,&rpnum);//得到接收到的數據的函數名及參數個數	  
	if(sta)return sta;//錯誤
	for(i=0;i<usmart_dev.fnum;i++)
	{
		sta=usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&spnum);//得到本地函數名及參數個數
		if(sta)return sta;//本地解析有誤	  
		if(usmart_strcmp(sfname,rfname))//相等
		{
			if(spnum>rpnum)return USMART_PARMERR;//參數錯誤(輸入參數比源函數參數少)
			usmart_dev.id=i;//記錄函數ID.
			break;//跳出.
		}	
	}
	if(i==usmart_dev.fnum)return USMART_NOFUNCFIND;	//未找到匹配的函數
 	sta=usmart_get_fparam(str,&i);					//得到函數參數個數	
	if(sta)return sta;								//返回錯誤
	usmart_dev.pnum=i;								//參數個數記錄
    return USMART_OK;
}
//usamrt執行函數
//該函數用于最終執行從串口收到的有效函數.
//最多支持10個參數的函數,更多的參數支持也很容易實現.不過用的很少.一般5個左右的參數的函數已經很少見了.
//該函數會在串口打印執行情況.以:"函數名(參數1,參數2...參數N)=返回值".的形式打印.
//當所執行的函數沒有返回值的時候,所打印的返回值是一個無意義的數據.
void usmart_exe(void)
{
	u8 id,i;
	u32 res;		   
	u32 temp[MAX_PARM];//參數轉換,使之支持了字符串 
	u8 sfname[MAX_FNAME_LEN];//存放本地函數名
	u8 pnum;
	id=usmart_dev.id;
	if(id>=usmart_dev.fnum)return;//不執行.
	usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum);//得到本地函數名,及參數個數 
	printf("\r\n%s(",sfname);//輸出正要執行的函數名
	for(i=0;i<pnum;i++)//輸出參數
	{
		if(usmart_dev.parmtype&(1<<i))//參數是字符串
		{
			printf("%c",'"');			 
			printf("%s",usmart_dev.parm+usmart_get_parmpos(i));
			printf("%c",'"');
			temp[i]=(u32)&(usmart_dev.parm[usmart_get_parmpos(i)]);
		}else						  //參數是數字
		{
			temp[i]=*(u32*)(usmart_dev.parm+usmart_get_parmpos(i));
			printf("%d",temp[i]);
		}
		if(i!=pnum-1)printf(",");
	}
	printf(")");
	switch(usmart_dev.pnum)
	{
		case 0://無參數(void類型)											  
			res=(*(u32(*)())usmart_dev.funs[id].func)();
			break;
	    case 1://有1個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
			break;
	    case 2://有2個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);
			break;
	    case 3://有3個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2]);
			break;
	    case 4://有4個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3]);
			break;
	    case 5://有5個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4]);
			break;
	    case 6://有6個參數
			res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
			temp[5]);
			break;
	    case 7://有7個參數
			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個參數
			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個參數
			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個參數
			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;
	}
	printf("=%d;\r\n",res);//輸出執行結果.
}
//usmart掃描函數
//通過調用該函數,實現usmart的各個控制.該函數需要每隔一定時間被調用一次
//以及時執行從串口發過來的各個函數.
//本函數可以在中斷里面調用,從而實現自動管理.
//如果非ALIENTEK用戶,則USART_RX_STA和USART_RX_BUF[]需要用戶自己實現
void usmart_scan(void)
{
	u8 sta,len;
	if(USART_RX_STA&0x8000)//串口接收完成?
	{					   
		len=USART_RX_STA&0x3fff;	//得到此次接收到的數據長度
		USART_RX_BUF[len]='\0';	//在末尾加入結束符. 
		sta=usmart_dev.cmd_rec(USART_RX_BUF);//得到函數各個信息
		if(sta==0)usmart_dev.exe();//執行函數
		else if(usmart_sys_cmd_exe(USART_RX_BUF))
		{
			switch(sta)
			{
				case USMART_FUNCERR:
					printf("函數錯誤!\r\n");   			
					break;	
				case USMART_PARMERR:
					printf("參數錯誤!\r\n");   			
					break;				
				case USMART_PARMOVER:
					printf("參數太多!\r\n");   			
					break;		
				case USMART_NOFUNCFIND:
					printf("未找到匹配的函數!\r\n");   			
					break;		
			}
		}
		USART_RX_STA=0;//狀態寄存器清空	    
	}
}		 














?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
jizz一区二区| 国产盗摄精品一区二区三区在线| 国产精品久久久爽爽爽麻豆色哟哟| 欧美性色黄大片手机版| 色美美综合视频| 91成人免费在线视频| 91久久线看在观草草青青| 色综合色狠狠综合色| 在线免费视频一区二区| 欧美亚洲综合网| 欧美一级片在线看| 91精品国产综合久久精品app| 欧美精品亚洲一区二区在线播放| 91精品国产乱| 久久精品这里都是精品| 亚洲天堂2016| 亚洲电影一级片| 国产中文字幕一区| av欧美精品.com| 欧美日韩视频一区二区| 日韩一区二区三| 久久久久久综合| 一区二区三区成人| 免费看欧美美女黄的网站| 久久精品国产在热久久| 国产激情一区二区三区桃花岛亚洲 | 成人国产精品视频| 在线精品视频小说1| 日韩你懂的电影在线观看| 国产亚洲午夜高清国产拍精品| 美女网站色91| 高清国产一区二区| 欧美老肥妇做.爰bbww| 日本一区二区在线不卡| 亚洲国产成人av好男人在线观看| 久久超碰97人人做人人爱| 一本到高清视频免费精品| 精品少妇一区二区| 一区二区三区高清| 国产美女娇喘av呻吟久久| 99久久伊人精品| 欧美成人三级电影在线| 一区二区三区免费观看| 国产高清精品在线| 91精品一区二区三区在线观看| 久久久电影一区二区三区| 日日夜夜精品视频天天综合网| 成人免费视频app| 日韩精品一区二区三区中文精品| 一区二区三区日韩欧美| 国产成人鲁色资源国产91色综| 制服丝袜亚洲色图| 亚洲一区二区三区四区在线免费观看 | 亚洲最快最全在线视频| 国产91精品精华液一区二区三区 | 狠狠色狠狠色综合日日91app| 色综合婷婷久久| 国产精品毛片大码女人| 国产偷v国产偷v亚洲高清| 久久亚洲综合色| 亚洲一区日韩精品中文字幕| 亚洲最大成人网4388xx| 不卡的av电影在线观看| 精品999在线播放| 免播放器亚洲一区| 在线视频一区二区三区| 椎名由奈av一区二区三区| 亚洲成a人v欧美综合天堂 | 国产精品1区2区| 有码一区二区三区| 精品精品欲导航| 色妹子一区二区| 国产乱人伦偷精品视频免下载| 亚洲色图欧洲色图| 久久综合九色综合97婷婷女人 | 国产午夜精品理论片a级大结局| 色久优优欧美色久优优| 久久激情五月激情| 日韩毛片视频在线看| 欧美变态凌虐bdsm| 欧美综合久久久| 欧美精品免费视频| 99精品1区2区| 国产中文字幕一区| 免费看欧美女人艹b| 国产清纯白嫩初高生在线观看91| 欧美日韩1234| 日本韩国欧美在线| 国产成人福利片| 精品在线亚洲视频| 性做久久久久久久久| 亚洲免费观看视频| 国产精品久久久久久久浪潮网站| 欧美一二三四区在线| 欧美视频三区在线播放| 色欧美乱欧美15图片| 成人午夜在线播放| 日韩精品亚洲一区| 亚洲在线免费播放| 亚洲特级片在线| 欧美国产1区2区| 久久久五月婷婷| 亚洲精品在线观看网站| 日韩欧美一区中文| 欧美一区二区三区婷婷月色| 欧美日韩国产三级| 欧美性大战久久久久久久| 91麻豆国产福利在线观看| 99在线精品免费| 99久久国产免费看| 99re成人精品视频| 91亚洲精品一区二区乱码| 国产精品中文字幕一区二区三区| 国产在线不卡一区| 国产曰批免费观看久久久| 国产资源在线一区| 韩国v欧美v日本v亚洲v| 国产一区二区在线观看免费| 国产伦精一区二区三区| 成人午夜在线免费| 91色综合久久久久婷婷| 在线看国产日韩| 欧美一区二区三区性视频| 精品日韩一区二区三区免费视频| 日韩欧美综合一区| 精品理论电影在线| 久久综合色综合88| 国产欧美日韩视频一区二区 | 国产亚洲视频系列| 中文一区二区在线观看| 国产精品久久久久久久久搜平片| 国产精品理论片在线观看| 国产精品久久久久久久久搜平片 | 日本午夜精品视频在线观看| 蜜臀av在线播放一区二区三区| 激情亚洲综合在线| 国产在线播放一区二区三区| 成人免费高清在线| 在线观看欧美日本| 日韩午夜在线观看| 中文字幕第一页久久| 一区二区三区四区精品在线视频| 日韩影院免费视频| 国产成人福利片| 欧美日韩极品在线观看一区| 精品免费日韩av| 成人欧美一区二区三区在线播放| 午夜影视日本亚洲欧洲精品| 麻豆国产91在线播放| 成人91在线观看| 6080午夜不卡| 国产精品久久国产精麻豆99网站| 亚洲成人av资源| 成人久久久精品乱码一区二区三区| 欧美影院午夜播放| 国产喷白浆一区二区三区| 亚洲电影在线免费观看| 国产精品一区一区三区| 欧美日韩一区视频| 欧美国产1区2区| 裸体歌舞表演一区二区| 91亚洲精品久久久蜜桃网站| 欧美大片在线观看一区| 一区二区三区在线免费播放 | 久久国产欧美日韩精品| 一本大道久久a久久精品综合| 91精品国产综合久久久蜜臀粉嫩| 日韩一区在线看| 国产乱一区二区| 日韩欧美一区二区不卡| 亚洲国产欧美日韩另类综合| 成人中文字幕合集| 欧美tickling网站挠脚心| 亚洲成a天堂v人片| 日本乱人伦aⅴ精品| 国产午夜精品理论片a级大结局| 免费精品99久久国产综合精品| 色欧美日韩亚洲| 成人欧美一区二区三区白人| 国产激情精品久久久第一区二区| 9191精品国产综合久久久久久 | 久久久久久久综合狠狠综合| 午夜电影网一区| 91成人免费网站| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲va欧美va国产va天堂影院| 9l国产精品久久久久麻豆| 久久精品视频一区二区三区| 另类中文字幕网| 日韩一区二区在线观看视频| 五月开心婷婷久久| 精品视频在线免费看| 一区二区三区精品视频在线| 色网综合在线观看| 亚洲激情第一区| 在线免费av一区| 亚洲伊人色欲综合网| 欧美日韩一区成人| 五月婷婷另类国产| 欧美一级高清片|