从定时器事件调用的Writefile导致错误access_denied

时间:2015-01-03 04:02:04

标签: c# timer writefile

我制作了一个APP,使用USB HID自定义从PIC读取ADC值,第一个测试是使用按钮读取值并将读取值传递给进度条和文本框,工作正常:< / p>

private void btnRead_Click(object sender, EventArgs e)
{
    txbCmd.Text = board.ADCVal().ToString();
    progressBar1.Value = Convert.ToInt32(txbCmd.Text);
}

如果我开始尽可能快地点击按钮,我将从ADC获得多个读取值,就像连续读取一样。

然后我尝试每隔1.5秒放一个带有事件的计时器来读取ADC(这比我连续多次按下按钮的速度慢):

private void timer1_Tick(object sender, EventArgs e)
{
    txbCmd.Text = board.ADCVal().ToString();
    progressBar1.Value = Convert.ToInt32(txbCmd.Text);
}

当我启动计时器时,第一次读取完成没有问题,但是下一次读取给出错误5,即访问被拒绝,如果我让程序运行一次读取而下一次给出错误然后下一次进行,然后再次出现下一个错误...我不知道为什么它可以通过单击按钮事件而不是来自使用相同代码的计时器事件。

修改

ADCVal方法调用名为WriteUSB的同一类中的另一个私有方法,将读取ADC命令发送到PIC板,然后使用私有方法ReadUSB从电路板读取命令接收确认,最后等待读取来自PIC板的ADC值,错误来自WriteUSB调用:

public UInt16 ADCVal()
{
    byte[] SndData = new byte[65]; 
    byte[] RcvData = new byte[65]; 

    SndData[0] = 0; //EP0 USB
    SndData[1] = _ADC_Val; //Cmd

    if (WriteUSB(ref SndData) == false) 
    {
        MessageBox.Show("Write USB Error: " + Marshal.GetLastWin32Error().ToString());
        return 0;
    }

    if (ReadUSB(ref RcvData, false) == true) 
    {
        if ((RcvData[1] == SndData[1]) && (RcvData[2] == 255))
        {

            if (ReadUSB(ref RcvData, false) == true)
            {
                return BitConverter.ToUInt16(RcvData, 2);
            }
            else
            {
                MessageBox.Show("Read USB Error: " + Marshal.GetLastWin32Error().ToString());
                return 0;
            }
        }
        else
        {
            MessageBox.Show("Read USB Error: " + Marshal.GetLastWin32Error().ToString());
            return 0;
        }
    }

    return 0;
}

私有方法WriteUSB具有WriteFile调用(ReadUSB具有ReadFile调用代码):

public bool WriteUSB(ref byte[] OutBuffer)
{
    int Bsize = OutBuffer.Length;
    string error;
    Int32 NumbersOfBytesWritten = 0;
    IntPtr UnManagedBuffer = Marshal.AllocHGlobal(Bsize); 
    Marshal.Copy(OutBuffer, 0, UnManagedBuffer, Bsize);

    if(WriteFile(USBDeviceInfo.WriteHandle, OutBuffer, Bsize, ref NumbersOfBytesWritten, IntPtr.Zero) == false)
    {
        error = Marshal.GetLastWin32Error().ToString();
        return false;
    }


    if (Marshal.GetLastWin32Error().ToString() == "0")
    {
        Marshal.FreeHGlobal(UnManagedBuffer);
        return true;
    }

    error = Marshal.GetLastWin32Error().ToString();
    return false;
}

0 个答案:

没有答案