C# 从计时器事件调用的Writefile导致错误访问被拒绝

C# 从计时器事件调用的Writefile导致错误访问被拒绝,c#,timer,writefile,C#,Timer,Writefile,我制作了一个应用程序,使用USB HID自定义从PIC读取ADC值,第一个测试是使用一个按钮读取值,并将读取值传递到进度条和文本框,效果良好: private void btnRead_Click(object sender, EventArgs e) { txbCmd.Text = board.ADCVal().ToString(); progressBar1.Value = Convert.ToInt32(txbCmd.Text); } 如果我开始尽可能快地点击按钮,我将从

我制作了一个应用程序,使用USB HID自定义从PIC读取ADC值,第一个测试是使用一个按钮读取值,并将读取值传递到进度条和文本框,效果良好:

private void btnRead_Click(object sender, EventArgs e)
{
    txbCmd.Text = board.ADCVal().ToString();
    progressBar1.Value = Convert.ToInt32(txbCmd.Text);
}
如果我开始尽可能快地点击按钮,我将从ADC获得多个读取值,就像连续读取一样

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

当我启动计时器时,第一次读取没有问题,但下一次读取时出现错误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调用代码):


“从…调用Writefile”-没有示例代码显示这一点。请考虑内联代码,明确哪些代码失败和哪些错误。@ AlxeelEnkkv我忘记了,谢谢我编辑了这个问题。给我的错误是5号访问被拒绝
WriteFile
定义仍然缺失。。。请注意,要正常工作,需要在导入中具有
DllImportAttribute(…SetLastError=true…)
。(我实际上无法回答您的问题,但如果您希望其他人会-删除所有与错误无关的代码-例如随机MessageBox调用和多次调用
GetLastWin32Error
和奇怪的
ToString
调用).旁注:在PInvoke期间没有发生错误时读取
GetLastWin32Error
,完全没有意义,将产生垃圾结果。这可能是问题的一部分。从WriteFile()获取“拒绝访问”错误非常奇怪。但是,这是当您尝试多次打开设备时会出现的错误。
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;
}
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;
}