主题 : wince6.0 中c#点响蜂鸣器怎么现实? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 60614
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2011-12-13
最后登录: 2011-12-13
楼主  发表于: 2011-12-13 15:55

 wince6.0 中c#点响蜂鸣器怎么现实?

首先说声对不起,在网上已经出现类似的帖子,
但因为我弄了两天都没有点响,所以在发帖;

c++代码可以点响;
DeviceIoControl(hPWM,2,&m_pwmvalue,sizeof(m_pwmvalue),NULL,NULL,NULL,NULL);// m_pwmvalue  是PWM的值  当PWM不为零时可以响;

我的c#代码是

using System;
using System.Linq;
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 wincedida
{
    unsafe public partial class Form2 : Form
    {
        
        public Form2()
        {
            InitializeComponent();
        }
          
         //控制蜂鸣器的步骤是1、打开流驱动接口2、操作硬件3、关闭流驱动接口
          public class Beep
        {
            const UInt32 OPEN_EXISTING = 3;
            const UInt32 GENERIC_READ = 0x80000000;
            const UInt32 GENERIC_WRITE = 0x40000000;
            const Int32 INVALID_HANDLE_VALUE = -1;

            private IntPtr hPort;

            // PWM的控制字,来源TQ2440/Src/Drivers/PWMDriver/PWMDriver.h文件
            const UInt32 IOCTL_PWM_SET_PRESCALER = 1;
            const UInt32 IOCTL_PWM_SET_DIVIDER = 2;
            const UInt32 IOCTL_PWM_START = 2;
            const UInt32 IOCTL_PWM_GET_FREQUENCY = 4;

            //首先找到函数在dll库中的原型
            //然后将该函数原型中的参数类型和C#中的数据类型进行比较得出C#的该函数原型如下
            [DllImport("coredll.dll")]
            public static extern IntPtr CreateFile(
                String lpFileName,
                UInt32 dwDesiredAccess,
                UInt32 dwShareMode,
                IntPtr lpSecurityAttributes,
                UInt32 dwCreationDisposition,
                UInt32 dwFlagsAndAttributes,
                IntPtr hTemplateFile
                );
            [DllImport("coredll.dll")]
            public static extern bool DeviceIoControl(
                IntPtr hDevice,
                UInt32 dwIoControlCode,
                UInt32[] lpInBuffer,
                UInt32 nInBufferSize,
                Byte[] lpOutBuffer,
                UInt32 nOutBufferSize,
                UInt32 lpBytesReturned,
                IntPtr lpOverlapped
                );
            [DllImport("coredll.dll")]
            public static extern bool CloseHandle(IntPtr hDevice);

            UInt32[] prescale = new UInt32[2] { 0, 15 };//15
            UInt32[] divider = new UInt32[2] { 0, 8 };//8
            UInt32[] buff = new UInt32[3] { 0, 488, 244 };//488,244来源
          
              /*int freq = 800;       // 工作频率初值
             #define S3C2440_PCLK 50000000    // PCLK是50MHz
             #define Prescaler0 15     // 预分频
             #define MUX0   8     // 定时器分频值
             #define TCNTB0   (S3C2440_PCLK/128/freq)   // 工作频率
             #define TCMPB0   (TCNTB0>>1)    // 占空比,默认是50%
        
             BYTE prescale[2] = {0, Prescaler0};
             BYTE divider[2] = {0, MUX0};
             DWORD buff[3] = {0, TCNTB0, TCMPB0};*/

            public void BeepLoad()
            {
                hPort = CreateFile("PWM1:", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                if (hPort == (IntPtr)INVALID_HANDLE_VALUE)
                {
                    MessageBox.Show("Open PWM Driver Fail");
                }
                DeviceIoControl(hPort, IOCTL_PWM_SET_PRESCALER, prescale, 2, null, 0, 0, IntPtr.Zero);
                DeviceIoControl(hPort, IOCTL_PWM_SET_DIVIDER, divider, 2, null, 0, 0, IntPtr.Zero);
                DeviceIoControl(hPort, IOCTL_PWM_START, buff, 3, null, 0, 0, IntPtr.Zero);

                 //Thread.Sleep(30);
                 //CloseHandle(hPort);
            }

            
        }
        
         //定时器是每秒执行一次
          private void timer1_Tick_1(object sender, EventArgs e)
          {
              new Beep().BeepLoad();          
            
          }

}

}


QQ  272254659