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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16、分學習,我們知道了設備是通過流驅動來操作,而流驅動測通過調(diào)用coredll中的一些函數(shù)來操作,主要操作就是圖3中的一些函數(shù)。二、c#中編寫PWM操作程序1、程序流程1.1聲明coredll中的相關函數(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三個函數(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應用以上函數(shù)來控制PWMprivate IntPtr hPort;hPort = CreateFile("PWM1:", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);              

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

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

評論

0/150

提交評論