C#wince調(diào)用dllimport指揮PWM蜂鳴器_第1頁(yè)
C#wince調(diào)用dllimport指揮PWM蜂鳴器_第2頁(yè)
C#wince調(diào)用dllimport指揮PWM蜂鳴器_第3頁(yè)
C#wince調(diào)用dllimport指揮PWM蜂鳴器_第4頁(yè)
C#wince調(diào)用dllimport指揮PWM蜂鳴器_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、  C#開發(fā)基于wince SDK的PWM控制軟件     前些天本人苦于vs2005下開發(fā)pwm的控制軟件,經(jīng)過(guò)幾天的努力,現(xiàn)已成功寫出了pwm的控制軟件,現(xiàn)總結(jié)如下      開發(fā)環(huán)境:mini2440+vs2005+vs2005 sp1+mini2440 SDK                沒(méi)有安裝wince6

2、.0及PB        一、學(xué)習(xí)相關(guān)的知識(shí)     1、流驅(qū)動(dòng)的相關(guān)知識(shí)1.1 流驅(qū)動(dòng)的主要接口Wince流驅(qū)動(dòng)方式與c+中開發(fā)dll很相相似,主要有以下幾個(gè)接口:      流接口函數(shù)               功能描述      &

3、#160;            調(diào)用流接口對(duì)象XXX_Init()                         初始化設(shè)備          &

4、#160;         系統(tǒng)設(shè)備管理器XXX_Denit()    卸載設(shè)備                    系統(tǒng)設(shè)備管理器XXX_Open()    打開設(shè)備進(jìn)行讀寫操作    

5、      文件API函數(shù)CreateFile()XXX_Close()    關(guān)閉設(shè)備                    文件API函數(shù)CloseHandle()XXX_Read()    讀取設(shè)備數(shù)據(jù)    &#

6、160;    文件API函數(shù)ReadFile()XXX_Write()    向設(shè)備寫數(shù)據(jù)         文件API函數(shù)WriteFile()XXX_IOControl()    對(duì)設(shè)備進(jìn)行各種操作         文件API函數(shù)DeviceIOControl()XXX_Seek()   

7、60;移動(dòng)設(shè)備數(shù)據(jù)的指針位置     文件API函數(shù)SetFilePointer()XXX_PowerDown()    使設(shè)備休眠                    系統(tǒng)電源管理器XXX_PowerUp()    恢復(fù)設(shè)備電源    

8、      系統(tǒng)電源管理器        圖1 流驅(qū)動(dòng)主要接口1.2  流驅(qū)動(dòng)工作及調(diào)用過(guò)程1)加載驅(qū)動(dòng)。在當(dāng)系統(tǒng)啟動(dòng)時(shí),設(shè)備管理器搜尋注冊(cè)表的HKEY_LOCAL_MACHINEDriverBuiltIn鍵下面的子鍵,并逐一加載子鍵下的每個(gè)驅(qū)動(dòng),此過(guò)程叫BusEnum。2)設(shè)備管理器從注冊(cè)表的dll鍵值中獲取驅(qū)動(dòng)程序所在的DLL文件名。3)設(shè)備管理器調(diào)用LoadDriver()函數(shù)把DLL加載到自己的虛擬地址空間內(nèi)。4)設(shè)備管理器在注

9、冊(cè)表的HKEY_LOCAL_MACHINEDriverActive下面,記錄所有已經(jīng)加載的驅(qū)動(dòng)程序。5)設(shè)備管理器調(diào)用驅(qū)動(dòng)中的XXX_Init()函數(shù)。6)在XXX_Init()中,通常對(duì)硬件進(jìn)行一些基本的初始化操作。通過(guò)以上6步,流接口驅(qū)動(dòng)被成功加載。7)應(yīng)用程序使用該設(shè)備。首先它調(diào)用CreateFile()打開設(shè)備。CreateFile()是在FileSys.exe中實(shí)現(xiàn)的。但是FileSys.exe只作簡(jiǎn)單判斷,如果發(fā)現(xiàn)打開的設(shè)備驅(qū)動(dòng)程序而不是一個(gè)文件,那么就重新把主動(dòng)權(quán)交還給設(shè)備管理器。8)設(shè)備管理器調(diào)用驅(qū)動(dòng)程序中的XXX_Open()函數(shù)打開設(shè)備。在XXX_Open()中,驅(qū)動(dòng)程序可

10、能會(huì)對(duì)硬件進(jìn)行一些額外的初始化工作,使硬件進(jìn)入工作狀態(tài)。9)XXX_Open()函數(shù)把打開設(shè)備的結(jié)果返回給設(shè)備管理器。10)設(shè)備管理器把XXX_Open()返回的結(jié)果,再返回給應(yīng)用程序的CreateFile()函數(shù)調(diào)用。通過(guò)7-10步,設(shè)備已被成功打開,至此就可以對(duì)設(shè)備進(jìn)行讀寫和控制操作。11)應(yīng)用程序使用第7步CreateFile()函數(shù)返回的句柄作為 ReadFile() / WriteFile()的第一個(gè)參數(shù),向設(shè)備發(fā)送讀請(qǐng)求。同樣ReadFile() / WriteFile()要經(jīng)過(guò)FileSys.exe轉(zhuǎn)發(fā)給設(shè)備管理器。12)設(shè)備管理器調(diào)用驅(qū)動(dòng)程序中的XXX_Read() / XXX

11、_Write() 函數(shù),讀取設(shè)備的數(shù)據(jù)信息或向設(shè)備寫信息。13)在流驅(qū)動(dòng)程序中,XXX_Read() / XXX_Write() 函數(shù)可與硬件交互,從硬件中讀取必要的信息或向硬件寫必要的信息。然后返回給設(shè)備管理器,再返回給應(yīng)用程序。當(dāng)應(yīng)用程序不再使用該設(shè)備時(shí),它可調(diào)用CloseHandle()將設(shè)備關(guān)閉。當(dāng)系統(tǒng)不再使用設(shè)備時(shí),應(yīng)用程序可調(diào)用DeactivateDevice()函數(shù)把該驅(qū)動(dòng)程序卸載   通過(guò)以上的過(guò)程我們已知道了流驅(qū)動(dòng)相關(guān)函數(shù)的調(diào)用過(guò)程及wince的一些硬件控制知識(shí)下面我們?cè)倭私庖幌?wince的系統(tǒng)架構(gòu)  2、Windows Embedd

12、ed CE 6.0的系統(tǒng)架構(gòu)的模塊組成                                  圖2 WINCE6.0 系統(tǒng)架構(gòu)   從這個(gè)架構(gòu)圖可以發(fā)現(xiàn)wince的應(yīng)用程序(windows CE Application)及其他的

13、一些服務(wù)都是通過(guò)win32 CE API函數(shù)來(lái)支持,通過(guò)API函數(shù)與內(nèi)核空間對(duì)話,達(dá)到控制硬件的目的。我們發(fā)現(xiàn)win32 CE APIS,中有coredll,winsock,commctrl ,commdlg,其中coredll就是我們驅(qū)動(dòng)PWM及一些其他的硬件所要用到的。3、了解coredll.dll的相關(guān)知識(shí)Coredll對(duì)于wince來(lái)說(shuō),就相當(dāng)于win32中的kernel32.dll,我們要調(diào)用驅(qū)動(dòng)中的一些:函數(shù),就得通過(guò)他來(lái)調(diào)用。Coredll有很多函數(shù),但我們驅(qū)動(dòng)PWM只用以下幾個(gè):coredll接口函數(shù)    功能描述CreateFile(

14、)    打開設(shè)備進(jìn)行讀寫操作CloseHandle()    關(guān)閉設(shè)備ReadFile()                         讀取設(shè)備數(shù)據(jù)WriteFile()        

15、0;                 向設(shè)備寫數(shù)據(jù)DeviceIOControl()    對(duì)設(shè)備進(jìn)行各種操作SetFilePointer()    移動(dòng)設(shè)備數(shù)據(jù)的指針位置    圖3 coredll中的API函數(shù)  4、綜合分析    通過(guò)以上3部

16、分學(xué)習(xí),我們知道了設(shè)備是通過(guò)流驅(qū)動(dòng)來(lái)操作,而流驅(qū)動(dòng)測(cè)通過(guò)調(diào)用coredll中的一些函數(shù)來(lái)操作,主要操作就是圖3中的一些函數(shù)。二、c#中編寫PWM操作程序1、程序流程1.1聲明coredll中的相關(guān)函數(shù)DllImport("coredll.dll")        public static extern IntPtr CreateFile(            String

17、lpFileName,             UInt32 dwDesiredAccess,            UInt32 dwShareMode,             IntPtr lpSecurityAttributes,

18、            UInt32 dwCreationDisposition,             UInt32 dwFlagsAndAttributes,             IntPtr hTemplateFile);

19、60;       DllImport("coredll.dll")        public static extern bool DeviceIoControl(            IntPtr hDevice,        &

20、#160;    UInt32 dwIoControlCode,             Byte lpInBuffer,             UInt32 nInBufferSize,           

21、; Byte lpOutBuffer,             UInt32 nOutBufferSize,             UInt32 lpBytesReturned,             IntPtr lpOve

22、rlapped);        DllImport("coredll.dll")        public static extern bool CloseHandle(IntPtr hDevice);       以上聲明了CreateFile,DeviceIoControl,CloseHandle三個(gè)函數(shù),注意要用coredll還要聲明引用空間usi

23、ng System.Runtime.InteropServices;還有一些常數(shù)/ Constant of Function        const UInt32 OPEN_EXISTING = 3;        const UInt32 GENERIC_READ = 0x80000000;        const UInt32 GENERIC_WRI

24、TE = 0x40000000;        const Int32 INVALID_HANDLE_VALUE = -1;還有一些操作的指令,這些指令可查看c:WINCE600platformmini2440srcdriverpwmpwm.h,這是BSP中的源程序文件        const UInt32 PWM_STOP = 1;        

25、60;     const UInt32 PWM_SET_FEQ = 2;1.2應(yīng)用以上函數(shù)來(lái)控制PWMprivate IntPtr hPort;hPort = CreateFile("PWM1:", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);              

26、60;   /打開設(shè)備DeviceIoControl(hPort, PWM_SET_FEQ, sBuf, 4, null, 0, 0, IntPtr.Zero);  /設(shè)置PWM頻率CloseHandle(hPort);                 /關(guān)閉PWM用以上3個(gè)函數(shù)就可以進(jìn)行PWM的常規(guī)操作了2、完整的程序2.1程序功能說(shuō)明  本程序是一個(gè)可設(shè)置PWM頻

27、率,可控制PWM開關(guān)時(shí)間程序2.2程序界面2.3程序using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Threading;namespace pwm_test    public partial

28、 class Form1 : Form                   private IntPtr hPort;        / Constant from PWM Driver        /查看c:WINCE600platformmini2440

29、srcdriverpwmpwm.h        const UInt32 PWM_STOP = 1;              const UInt32 PWM_SET_FEQ = 2;        const UInt32 PWM_SET_DUTY = 3;   

30、     DllImport("coredll.dll")        public static extern IntPtr CreateFile(            String lpFileName,          

31、0;  UInt32 dwDesiredAccess,            UInt32 dwShareMode,             IntPtr lpSecurityAttributes,            

32、0;UInt32 dwCreationDisposition,             UInt32 dwFlagsAndAttributes,             IntPtr hTemplateFile);        DllImport("coredll.d

33、ll")        public static extern bool DeviceIoControl(            IntPtr hDevice,             UInt32 dwIoControlCode,    

34、;         Byte lpInBuffer,             UInt32 nInBufferSize,            Byte lpOutBuffer,        

35、60;    UInt32 nOutBufferSize,             UInt32 lpBytesReturned,             IntPtr lpOverlapped);        DllImport(&qu

36、ot;coredll.dll")        public static extern bool CloseHandle(IntPtr hDevice);        / Constant of Function        const UInt32 OPEN_EXISTING = 3;    

37、0;   const UInt32 GENERIC_READ = 0x80000000;        const UInt32 GENERIC_WRITE = 0x40000000;        const Int32 INVALID_HANDLE_VALUE = -1;        public bool pwm_ena

38、 = true;        public int   tpwmon;        public int   tpwmoff;        public bool pwm_level=false ;        /函數(shù):FreqSe

39、t 設(shè)置PWM頻率        private void FreqSet(UInt32 value)                    byte sBuf = new byte4;           &

40、#160;UInt32 sInput;            / Check Open Device already            if (hPort != (IntPtr)INVALID_HANDLE_VALUE)           &#

41、160;                sInput = 50;                / Convert sInput(UInt32) to sBuf(Array of Byte)       

42、60;        BitConverter.GetBytes(sInput).CopyTo(sBuf, 0);                / Set Duty0-99 to PWM Device             &

43、#160;  DeviceIoControl(hPort, PWM_SET_DUTY, sBuf, 4, null, 0, 0, IntPtr.Zero);                sInput = value;                / Con

44、vert sInput(UInt32) to sBuf(Array of Byte)                BitConverter.GetBytes(sInput).CopyTo(sBuf, 0);                / Set Freq to PWM De

45、vice                DeviceIoControl(hPort, PWM_SET_FEQ, sBuf, 4, null, 0, 0, IntPtr.Zero);                     

46、0;      public Form1()                   InitializeComponent();                   

47、60;    private void button1_Click(object sender, EventArgs e)                    if (pwm_ena)              

48、60;                          button1.Text = "Stop"                pwm_ena = false;

49、60;               tpwmoff =Convert .ToInt32  (offtime.Value);                tpwmon =Convert .ToInt32 ( ontime.Value);   

50、;             timer1.Interval = tpwmon;                timer1.Enabled = true;             

51、    FreqSet(Convert.ToUInt32(pwm_freq.Value );                pwm_level = true;                     

52、   else                            button1.Text = "Start"             

53、   FreqSet (Convert .ToUInt32 (0);                timer1 .Enabled =false ;                pwm_ena =true ;   &#

54、160;                        private void Form1_Closed(object sender, EventArgs e)                

55、60;   if (hPort != (IntPtr)INVALID_HANDLE_VALUE)                / Close PWM Device                CloseHandle(hPort); &#

56、160;              private void Form1_Load(object sender, EventArgs e)                    / Open PWM Device    

57、        hPort = CreateFile("PWM1:", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);            if (hPort = (IntPtr)INVALID_HANDLE_VALUE)                            MessageBox.Sh

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論