




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025全員安全培訓(xùn)考試試題完美
- 2024-2025管理人員崗前安全培訓(xùn)考試試題及參考答案
- 2025年土地流轉(zhuǎn)相關(guān)合同范本
- 2025年訂單合同范文
- 2025防水涂料采購(gòu)合同范本
- 2025年度摩托車租賃合同
- 2025年長(zhǎng)春市房屋租賃合同范本
- 2025年車用交流發(fā)電機(jī)合作協(xié)議書
- 2025流動(dòng)資產(chǎn)外匯借款合同
- 2025竹林買賣合同模板
- 2025陜西漢中漢源電力(集團(tuán))限公司招聘56人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 南京師范大學(xué)自主招生個(gè)人陳述范文與撰寫要點(diǎn)
- 鐵粉運(yùn)輸合同協(xié)議
- 計(jì)算機(jī)網(wǎng)絡(luò)安全知識(shí)試題及答案2025年計(jì)算機(jī)二級(jí)考試
- 浙江省A9協(xié)作體2024-2025學(xué)年高二下學(xué)期4月期中聯(lián)考語(yǔ)文試卷(含答案 )
- (四調(diào))武漢市2025屆高中畢業(yè)生四月調(diào)研考試 語(yǔ)文試卷(含答案詳解)
- 廣州廣州市天河區(qū)華陽(yáng)小學(xué)-畢業(yè)在即家校共話未來(lái)-六下期中家長(zhǎng)會(huì)【課件】
- 第4單元 亮火蟲(教學(xué)設(shè)計(jì))-2024-2025學(xué)年粵教花城版(2024)音樂(lè)一年級(jí)下冊(cè)
- 車間生產(chǎn)材料管理制度
- 西師大版小學(xué)五年級(jí)數(shù)學(xué)(下)期中測(cè)試題(含答案)
- 廣東省深圳市龍華區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期中數(shù)學(xué)試題(含答案)
評(píng)論
0/150
提交評(píng)論