文章目錄
3 輸入系統(tǒng)應(yīng)用開(kāi)發(fā)
3.1 什么是輸入系統(tǒng)?
3.2 輸入系統(tǒng)應(yīng)用框架描述
3.3 輸入系統(tǒng)事件的讀取與分析
3.4 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)一:通用USB鼠標(biāo)事件讀取
3.5 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)二:通用鍵盤(pán)事件讀取
3.6 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)三:百問(wèn)網(wǎng)imx6ul開(kāi)發(fā)板觸摸屏事件讀取
3 輸入系統(tǒng)應(yīng)用開(kāi)發(fā)
3.1 什么是輸入系統(tǒng)?
? 在了解輸入系統(tǒng)之前,先來(lái)了解什么是輸入設(shè)備?常見(jiàn)的輸入設(shè)備有鍵盤(pán)、鼠標(biāo)、遙控桿、書(shū)寫(xiě)板、觸摸屏等等,用戶(hù)通過(guò)這些輸入設(shè)備與Linux系統(tǒng)進(jìn)行數(shù)據(jù)交換,Linux系統(tǒng)為了統(tǒng)一管控和處理這些設(shè)備,于是就實(shí)現(xiàn)了一套固定的與硬件無(wú)關(guān)的輸入系統(tǒng)框架,供用戶(hù)空間程序使用,這就是輸入系統(tǒng)。
3.2 輸入系統(tǒng)應(yīng)用框架描述
? 在Linux輸入系統(tǒng)中,主要分三層進(jìn)行管理,分別是input core(輸入系統(tǒng)核心層)、drivers(輸入系統(tǒng)驅(qū)動(dòng)層)以及event handlers(輸入系統(tǒng)事件層),如下圖所示,這就是Linux輸入系統(tǒng)的基本框架:
? 舉個(gè)非常簡(jiǎn)單的例子,比如用戶(hù)按下鍵盤(pán)里的其中一個(gè)按鍵,它遵循流程是這樣的:
? 按鍵按下–>輸入系統(tǒng)驅(qū)動(dòng)層–>輸入系統(tǒng)核心層–>輸入系統(tǒng)事件層—>用戶(hù)空間
? 對(duì)于應(yīng)用程序軟件編程的角度,我們只需要關(guān)注用戶(hù)空間是怎么得到按鍵按下以后獲取的是什么事件就可以了,例如我想知道我當(dāng)前按下的按是短按還是長(zhǎng)按?或者我想知道當(dāng)前我按下鍵盤(pán)的是空格鍵還是回車(chē)鍵等等。
3.3 輸入系統(tǒng)事件的讀取與分析
? 用戶(hù)空間的設(shè)備節(jié)點(diǎn)那么多,怎么知道當(dāng)前是哪個(gè)設(shè)備上報(bào)的呢?例如想知道鍵盤(pán)是由哪個(gè)設(shè)備節(jié)點(diǎn)上報(bào)的,就可以通過(guò)以下這條指令來(lái)獲?。?/p>
cat /proc/bus/input/devices
? 這條指令的含義就是獲取與event對(duì)應(yīng)的相關(guān)設(shè)備信息,在ubuntu系統(tǒng)上,我們輸入這個(gè)指令可以看到以下結(jié)果:
? 那么這里的I、N、P、S、U、H、B對(duì)應(yīng)的每一行是什么含義呢?
I:id of the device(設(shè)備ID)
該參數(shù)由結(jié)構(gòu)體struct input_id來(lái)進(jìn)行描述
41 struct input_id { 42 //總線(xiàn)類(lèi)型 43 __u16 bustype; 44 //與廠商相關(guān)ID 45 __u16 vendor; 46 //與產(chǎn)品相關(guān)ID 47 __u16 product; 48 //版本ID 49 __u16 version; 50 };
N:name of the device
設(shè)備名稱(chēng)
P:physical path to the device in the system hierarchy
系統(tǒng)層次結(jié)構(gòu)中設(shè)備的物理路徑。
S:sysfs path
位于sys文件系統(tǒng)的路徑
U:unique identification code for the device(if device has it)
設(shè)備的唯一標(biāo)識(shí)碼
H:list of input handles associated with the device.
與設(shè)備關(guān)聯(lián)的輸入句柄列表。
B:bitmaps(位圖)
PROP:device properties and quirks.
EV:types of events supported by the device.
KEY:keys/buttons this device has.
MSC:miscellaneous events supported by the device.
LED:leds present on the device.
PROP:設(shè)備屬性和怪癖。
EV:設(shè)備支持的事件類(lèi)型。
KEY:此設(shè)備具有的鍵/按鈕。
MSC:設(shè)備支持的其他事件。
LED:設(shè)備上的指示燈。
通過(guò)了解以上參數(shù)的含義,結(jié)合以下指令
cat /proc/bus/input/devices
顯示出來(lái)的信息很容易可以知道event1即是鍵盤(pán)上報(bào)的事件設(shè)備節(jié)點(diǎn),通過(guò)讀取這個(gè)event1即可獲得當(dāng)前用戶(hù)按下的按鍵具體是哪個(gè)事件。
使用cat命令來(lái)測(cè)試鍵盤(pán)事件
當(dāng)我們?cè)诮K端輸入
cat /dev/input/event1
? 這條指令并按回車(chē)鍵后可以看到一堆亂碼數(shù)據(jù),這些數(shù)據(jù)我們看不懂,但是我們可以知道如果按下了按鍵,終端有反饋消息,這時(shí)候就知道這個(gè)事件就是我們當(dāng)前操作的這個(gè)設(shè)備上報(bào)的事件,那么如何能讓這些數(shù)據(jù)看得懂呢?這時(shí)候可以使用hexdump命令來(lái)讀取鍵盤(pán)事件。
使用hexdump命令來(lái)測(cè)試鍵盤(pán)事件
這些數(shù)值是通過(guò)input_event結(jié)構(gòu)體來(lái)上報(bào)的,它位于/usr/include/linux/input.h這個(gè)頭文件,input_event結(jié)構(gòu)體描述如下:
24 struct input_event { 25 //事件發(fā)生的事件 26 struct timeval time; 27 //事件類(lèi)型 28 __u16 type; 29 //事件值 30 __u16 code; 31 //該事件上報(bào)的數(shù)值 32 __s32 value; 33 };
而input_event結(jié)構(gòu)體中的time即是:
1 struct timeval 2 { 3 __time_t tv_sec; /* Seconds. */ 4 __suseconds_t tv_usec; /*Microseconds. */ 5 };
? 其中tv_sec為Epoch到創(chuàng)建struct timeval時(shí)的秒數(shù),tv_usec為微秒數(shù),即秒后面的零頭,Epoch的意思是指定為1970年一月一日凌晨零點(diǎn)零分零秒,格林威治時(shí)間。
? 回到input_event結(jié)構(gòu)體,事件類(lèi)型type主要有以下三種,分別是:相對(duì)事件、絕對(duì)事件、鍵盤(pán)事件
? 例如:鼠標(biāo)就是一個(gè)相對(duì)事件,有些情況下也有可能是絕對(duì)事件,當(dāng)移動(dòng)鼠標(biāo)的時(shí)候,type類(lèi)型也就是底層上報(bào)給用戶(hù)的事件類(lèi)型,那么code表示的就是相對(duì)于鼠標(biāo)當(dāng)前的位置的X或者Y的坐標(biāo),value則表示相對(duì)于當(dāng)前的位置偏移了多少。
事件類(lèi)型(type)
文件頭文件路徑:
/usr/include/linux/input-event-codes.h
當(dāng)然Linux內(nèi)核版本較低的有可能在以下路徑的這個(gè)頭文件:
/usr/include/linux/input.h
34 /* 35 * Event types 36 */ 37 38 #define EV_SYN 0x00 //同步事件 39 #define EV_KEY 0x01 //按鍵事件 40 #define EV_REL 0x02 //相對(duì)事件 41 #define EV_ABS 0x03 //絕對(duì)事件 42 #define EV_MSC 0x04 43 #define EV_SW 0x05 44 #define EV_LED 0x11 45 #define EV_SND 0x12 46 #define EV_REP 0x14 47 #define EV_FF 0x15 48 #define EV_PWR 0x16 49 #define EV_FF_STATUS 0x17 50 #define EV_MAX 0x1f 51 #define EV_CNT (EV_MAX+1)
事件值(code)
由于事件值種類(lèi)繁多,這里就不一一列舉出來(lái),這里舉例鍵盤(pán)的部分事件值:
文件頭文件路徑:
/usr/include/linux/input-event-codes.h
當(dāng)然Linux內(nèi)核版本較低的有可能在以下路徑的這個(gè)頭文件:
/usr/include/linux/input.h 64 /* 65 * Keys and buttons 66 * 67 * Most of the keys/buttons are modeled after USB HUT 1.12 68 * (see http://www.usb.org/developers/hidpage). 69 * Abbreviations in the comments: 70 * AC - Application Control 71 * AL - Application Launch Button 72 * SC - System Control 73 */ 74 75 #define KEY_RESERVED 0 76 #define KEY_ESC 1 77 #define KEY_1 2 78 #define KEY_2 3 79 #define KEY_3 4 80 #define KEY_4 5 81 #define KEY_5 6 82 #define KEY_6 7 83 #define KEY_7 8 84 #define KEY_8 9 85 #define KEY_9 10 86 #define KEY_0 11 87 #define KEY_MINUS 12 88 #define KEY_EQUAL 13 89 #define KEY_BACKSPACE 14 90 #define KEY_TAB 15 91 #define KEY_Q 16 92 #define KEY_W 17 ...
當(dāng)然還有鼠標(biāo)事件值、搖桿事件值、觸摸屏事件值等等。
該事件上報(bào)的數(shù)值(value)
? 這部分上面已經(jīng)舉了鼠標(biāo)的案例進(jìn)行了介紹,接下來(lái)我們就通過(guò)應(yīng)用程序來(lái)獲取事件,后面章節(jié)將會(huì)通過(guò)鼠標(biāo)、鍵盤(pán)以及觸摸屏三個(gè)案例,進(jìn)一步的了解輸入系統(tǒng)的應(yīng)用編程。
3.4 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)一:通用USB鼠標(biāo)事件讀取
? 根據(jù)前面章節(jié)的講解,如果我們需要獲取USB鼠標(biāo)的事件,首先我們要先通過(guò)cat /proc/bus/input/devices這個(gè)指令查詢(xún)與USB鼠標(biāo)事件對(duì)應(yīng)的相關(guān)設(shè)備信息,通過(guò)實(shí)際測(cè)試得知,event2為USB鼠標(biāo)上報(bào)的事件節(jié)點(diǎn)。
接下來(lái),通過(guò)hexdump命令測(cè)試一下鼠標(biāo)事件的輸出:
? 具體上報(bào)的數(shù)值是什么含義可以結(jié)合3.3章節(jié)進(jìn)行分析,這里就不再進(jìn)行闡述,本節(jié)的目的是編寫(xiě)一個(gè)獲取通用USB鼠標(biāo)的事件的應(yīng)用程序,要獲取一個(gè)事件,我們需要了解以下幾個(gè)部分。
1 設(shè)備上報(bào)事件類(lèi)型(type)
通過(guò)3.3章節(jié),我們知道找到對(duì)應(yīng)的事件類(lèi)型的定義:
文件頭文件路徑:
/usr/include/linux/input-event-codes.h
當(dāng)然Linux內(nèi)核版本較低的有可能在以下路徑的這個(gè)頭文件:
/usr/include/linux/input.h
34 /* 35 * Event types 36 */ 37 38 #define EV_SYN 0x00 //同步事件 39 #define EV_KEY 0x01 //按鍵事件 40 #define EV_REL 0x02 //相對(duì)事件 41 #define EV_ABS 0x03 //絕對(duì)事件 42 #define EV_MSC 0x04 43 #define EV_SW 0x05 44 #define EV_LED 0x11 45 #define EV_SND 0x12 46 #define EV_REP 0x14 47 #define EV_FF 0x15 48 #define EV_PWR 0x16 49 #define EV_FF_STATUS 0x17 50 #define EV_MAX 0x1f 51 #define EV_CNT (EV_MAX+1)
2 設(shè)備上報(bào)的事件值(code)
由于本節(jié)我們寫(xiě)的是通用USB鼠標(biāo)的應(yīng)用程序,所以我們找到鼠標(biāo)相關(guān)的code,如下:
文件頭文件路徑:
/usr/include/linux/input-event-codes.h
當(dāng)然Linux內(nèi)核版本較低的有可能在以下路徑的這個(gè)頭文件:
/usr/include/linux/input.h
696 /* 697 * Relative axes 698 */ 699 700 #define REL_X 0x00 //相對(duì)X坐標(biāo) 701 #define REL_Y 0x01 //相對(duì)Y坐標(biāo) 702 #define REL_Z 0x02 703 #define REL_RX 0x03 704 #define REL_RY 0x04 705 #define REL_RZ 0x05 706 #define REL_HWHEEL 0x06 707 #define REL_DIAL 0x07 708 #define REL_WHEEL 0x08 709 #define REL_MISC 0x09 710 #define REL_MAX 0x0f 711 #define REL_CNT (REL_MAX+1)
在這里,我們暫時(shí)只會(huì)用來(lái)REL_X和REL_Y這兩個(gè)參數(shù)。
? 那么所謂的value,就是選擇具體的事件類(lèi)型(type)和具體的事件值(code)以后所反應(yīng)出來(lái)的值,鼠標(biāo)就是相對(duì)于當(dāng)前X或者相對(duì)于當(dāng)前Y的值,接下來(lái),我們來(lái)看一下如何來(lái)讀取鼠標(biāo)事件。
在編寫(xiě)input應(yīng)用程序之前,在程序中需要包含以下頭文件:
#include
程序編寫(xiě)步驟:
1 定義一個(gè)結(jié)構(gòu)體變量input_event用于描述input事件
struct input_event event_mouse ;
2 打開(kāi)input設(shè)備的事件節(jié)點(diǎn),這里我們獲取的通用USB鼠標(biāo)是event2
open("/dev/input/event2",O_RDONLY);
3 讀取事件
read(fd ,&event_mouse ,sizeof(event_mouse));
4 根據(jù)上報(bào)的事件進(jìn)行處理
//判斷鼠標(biāo)上報(bào)的類(lèi)型,可能為絕對(duì)事件,也有可能是相對(duì)事件 if(EV_ABS == event_mouse.type || EV_REL == event_mouse.type) { //code表示相對(duì)位移X或者Y,當(dāng)判斷是X時(shí),打印X的相對(duì)位移value //當(dāng)判斷是Y時(shí),打印Y的相對(duì)位移value if(event_mouse.code == REL_X) { printf("event_mouse.code_X:%dn", event_mouse.code); printf("event_mouse.value_X:%dn", event_mouse.value); } else if(event_mouse.code == REL_Y) { printf("event_mouse.code_Y:%dn", event_mouse.code); printf("event_mouse.value_Y:%dn", event_mouse.value); } }
5 關(guān)閉文件描述符
close(fd);
不難發(fā)現(xiàn),獲取一個(gè)輸入系統(tǒng)事件,也是標(biāo)準(zhǔn)的文件操作,這體現(xiàn)了Linux一切皆文件的思想。
完整的程序案例如下:
01 #include 02 #include 03 #include 04 #include 05 #include 06 07 int main(void) 08 { 09 //1、定義一個(gè)結(jié)構(gòu)體變量用來(lái)描述input事件 10 struct input_event event_mouse ; 11 //2、打開(kāi)input設(shè)備的事件節(jié)點(diǎn) 我的通用USB鼠標(biāo)事件的節(jié)點(diǎn)是event2 12 int fd = -1 ; 13 fd = open("/dev/input/event2", O_RDONLY); 14 if(-1 == fd) 15 { 16 printf("open mouse event fair!n"); 17 return -1 ; 18 } 19 while(1) 20 { 21 //3、讀事件 22 read(fd, &event_mouse, sizeof(event_mouse)); 23 if(EV_ABS == event_mouse.type || EV_REL == event_mouse.type) 24 { 25 //code表示相對(duì)位移X或者Y,當(dāng)判斷是X時(shí),打印X的相對(duì)位移value 26 //當(dāng)判斷是Y時(shí),打印Y的相對(duì)位移value 27 if(event_mouse.code == REL_X) 28 { 29 printf("event_mouse.code_X:%dn", event_mouse.code); 30 printf("event_mouse.value_X:%dn", event_mouse.value); 31 } 32 else if(event_mouse.code == REL_Y) 33 { 34 printf("event_mouse.code_Y:%dn", event_mouse.code); 35 printf("event_mouse.value_Y:%dn", event_mouse.value); 36 } 37 } 38 } 39 close(fd); 40 return 0 ; 41 }
代碼編寫(xiě)完畢后,然后執(zhí)行
gcc test_mouse.c -o test_mouse
編譯程序:
編譯成功后會(huì)生成test_mouse,接下來(lái)執(zhí)行test_mouse這個(gè)程序。
當(dāng)鼠標(biāo)左右移動(dòng)的時(shí)候上報(bào)的事件:
這時(shí)候可以看到,只有相對(duì)于X的事件值在發(fā)生,這時(shí)候打印的value是X方向相對(duì)于原點(diǎn)坐標(biāo)的偏移值。
當(dāng)鼠標(biāo)上下移動(dòng)的時(shí)候上報(bào)的事件:
這時(shí)候可以看到,只有相對(duì)于Y的事件值在發(fā)生,這時(shí)候打印的value是Y方向相對(duì)于原點(diǎn)坐標(biāo)的偏移值。
3.5 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)二:通用鍵盤(pán)事件讀取
? 如何獲取鍵盤(pán)事件在3.3章節(jié)已經(jīng)有了相應(yīng)的介紹,這里就不再寫(xiě)出來(lái),本節(jié)實(shí)現(xiàn)的是通用鍵盤(pán)事件的獲取,結(jié)合3.4章節(jié)獲取鼠標(biāo)事件的方式,這里通用鍵盤(pán)事件的節(jié)點(diǎn)為event1,通過(guò)結(jié)合3.3章節(jié)與3.4章節(jié),編寫(xiě)步驟如下:
在編寫(xiě)input應(yīng)用程序之前,在程序中需要包含以下頭文件:
#include
程序編寫(xiě)步驟:
1 定義一個(gè)結(jié)構(gòu)體變量input_event用于描述input事件
struct input_event event_keyboard ;
2 打開(kāi)input設(shè)備的事件節(jié)點(diǎn),我的通用鍵盤(pán)事件的節(jié)點(diǎn)是event1
open("/dev/input/event1",O_RDONLY);
3 讀取事件
read(fd ,&event_keyboard ,sizeof(event_keyboard));
4 根據(jù)上報(bào)的事件進(jìn)行處理
//判斷鍵盤(pán)事件上報(bào)的類(lèi)型 if(EV_KEY == event_keyboard.type) { if(1 == event_keyboard.value) printf("事件類(lèi)型:%d 事件值:%d 按下n", event_keyboard.type, event_keyboard.code); else if(0 == event_keyboard.value) printf("事件類(lèi)型:%d 事件值:%d 釋放n", event_keyboard.type, event_keyboard.code); }
5 關(guān)閉文件描述符
close(fd);
完整程序案例實(shí)現(xiàn)如下:
01 #include 02 #include 03 #include 04 #include 05 #include 06 07 int main(void) 08 { 09 //1、定義一個(gè)結(jié)構(gòu)體變量用來(lái)描述input事件 10 struct input_event event_keyboard ; 11 //2、打開(kāi)input設(shè)備的事件節(jié)點(diǎn) 我的通用鍵盤(pán)事件的節(jié)點(diǎn)是event1 12 int fd = -1 ; 13 fd = open("/dev/input/event1", O_RDONLY); 14 if(-1 == fd) 15 { 16 printf("open mouse event fair!n"); 17 return -1 ; 18 } 19 while(1) 20 { 21 //3、讀事件 22 read(fd, &event_keyboard, sizeof(event_keyboard)); 23 if(EV_KEY == event_keyboard.type) 24 { 25 if(1 == event_keyboard.value) 26 printf("事件類(lèi)型:%d 事件值:%d 按下n",event_keyboard.type,event_keyboard.code); 27 else if(0 == event_keyboard.value) 28 printf("事件類(lèi)型:%d 事件值:%d 釋放n",event_keyboard.type,event_keyboard.code); 29 } 30 } 31 close(fd); 32 return 0 ; 33 }
? 不難發(fā)現(xiàn),通用USB鍵盤(pán)程序編寫(xiě)步驟與通用USB鼠標(biāo)程序編寫(xiě)步驟幾乎一樣,區(qū)別只是讀取的事件類(lèi)型以及后面處理的數(shù)據(jù)value不同。
代碼編寫(xiě)完畢后,然后執(zhí)行
gcc test_keyboard.c -o test_keyboard
編譯程序:
編譯成功后會(huì)生成test_keyboard,接下來(lái)執(zhí)行test_keyboard這個(gè)程序。
當(dāng)按下按鍵時(shí)候,可以觀察到按鍵的按下和釋放的過(guò)程,這其實(shí)就是同一個(gè)事件下的兩個(gè)不同的狀態(tài)。
3.6 輸入系統(tǒng)應(yīng)用編程實(shí)戰(zhàn)三:百問(wèn)網(wǎng)imx6ul開(kāi)發(fā)板觸摸屏事件讀取
? 在前面,我們已經(jīng)熟悉了鼠標(biāo)、鍵盤(pán)的基本操作,但發(fā)現(xiàn)一個(gè)規(guī)律,那就是編程方法類(lèi)似,唯一不同的地方就是獲取的事件類(lèi)型以及事件值不同,那么觸摸屏在input系統(tǒng)中是一類(lèi)什么事件呢?
? 一般情況下,觸摸屏在input系統(tǒng)中屬于絕對(duì)事件,也就是觸摸的坐標(biāo)點(diǎn)X和Y會(huì)在屏幕的分辨率范圍內(nèi)上報(bào)一個(gè)絕對(duì)的坐標(biāo)。
絕對(duì)事件對(duì)應(yīng)的值為:EV_ABS
相應(yīng)X和Y分量的值分別為:
ABS_MT_POSITION_X、ABS_MT_POSITION_Y
通過(guò)結(jié)合前面的章節(jié)內(nèi)容,很容易編寫(xiě)如下程序:
01 #include 02 #include 03 #include 04 #include 05 #include 06 07 int main(int argc, char **argv) 08 { 09 int tp_fd = -1 ; 10 int tp_ret = -1 ; 11 int touch_x,touch_y ; 12 struct input_event imx6ull_ts ; 13 //1、打開(kāi)觸摸屏事件節(jié)點(diǎn) 14 tp_fd = open("/dev/input/event1",O_RDONLY); 15 if(tp_fd < 0) 16 { 17 printf("open /dev/input/event1 fail!n"); 18 return -1 ; 19 } 20 while(1) 21 { 22 //2、獲取觸摸屏相應(yīng)的事件,并打印出當(dāng)前觸摸的坐標(biāo) 23 read(tp_fd ,&imx6ull_ts ,sizeof(imx6ull_ts)); 24 switch(imx6ull_ts.type) 25 { 26 case EV_ABS: 27 if(imx6ull_ts.code == ABS_MT_POSITION_X) 28 touch_x = imx6ull_ts.value ; 29 if(imx6ull_ts.code == ABS_MT_POSITION_Y) 30 touch_y = imx6ull_ts.value ; 31 break ; 32 defalut: 33 break ; 34 } 35 printf("touch_x:%d touch_y:%dn",touch_x,touch_y); 36 usleep(100); 37 } 38 close(tp_fd); 39 return 0; 40 }
代碼編寫(xiě)完畢后,然后執(zhí)行
gcc test_touchscreen.c -o test_touchscreen
交叉編譯程序:(注意這里是要在開(kāi)發(fā)板運(yùn)行,不是在PC端)
接下來(lái)啟動(dòng)開(kāi)發(fā)板,然后串口終端輸出rz命令,等待接收PC端的文件,這里我們將test_touchscreen這個(gè)文件傳輸?shù)介_(kāi)發(fā)板。
具體操作步驟可參考第11章:PC和開(kāi)發(fā)板之間傳輸文件
接下來(lái)給test_touchscreen添加可執(zhí)行權(quán)限:
執(zhí)行test_touchscreen,然后用手觸摸屏,可以看到有相應(yīng)的坐標(biāo)值打?。?/p>
審核編輯黃昊宇
-
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213747 -
開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
373瀏覽量
41510
發(fā)布評(píng)論請(qǐng)先 登錄
現(xiàn)代控制理論-第三章-線(xiàn)性系統(tǒng)的能控性與能觀性
自動(dòng)控制原理第三章習(xí)題答案
STM8S BLDC 電機(jī) 第三章 EEPROM 實(shí)驗(yàn)例程
電力系統(tǒng)繼電保護(hù)第三章-電網(wǎng)的距離保護(hù)(課件).ppt

慕課嵌入式開(kāi)發(fā)及應(yīng)用(第三章.脈寬調(diào)制.輸入捕捉.輸出比較))

慕課嵌入式開(kāi)發(fā)及應(yīng)用(第三章.單元測(cè)試)

慕課嵌入式開(kāi)發(fā)及應(yīng)用(第三章.GPIO應(yīng)用-鍵盤(pán))

迅為電子RK3588S開(kāi)發(fā)板第三章Buildroot系統(tǒng)功能測(cè)試

評(píng)論