2014-11-24 16 views
1

我已經在一個項目中使用C#一直在努力,我似乎​​無法能夠弄清楚如何使用API​​.dll我一直提供。 API用於控制gpio幷包含輸入的中斷函數。我爲api提供的文檔非常有限,我無法訪問代碼本身。我設法使用輪詢機制來使所有的工作都能正常工作,但我似乎無法設置中斷。我讀過很多關於msdn和codeproject的文章,並通過一些堆棧溢出問題進行了瀏覽,但是我的代碼仍然失敗。 功能我想使用看起來像這樣:觸發由C++ C#的事件和WinCE7設備上宣佈LPCWSTR

BOOL GpioSetupInterruptPin(HANDLE hGPIO, PIN_GPIO_PORT port, UINT pin, INT_TRIGGER_MODE mode, INT_TRIGGER_POLARITY polarity, LPCWSTR szEventName, BOOL enable); 

我已經給出了PORT,TRIGGER_MODE和TRIGGER_POLARITY和szEventName下面的描述結構:「指定事件的事件名稱」。這就是我爲這個功能所做的一切,我一直無法聯繫開發人員。 我發現關於使用LPCWSTR用的PInvoke和修復了幾個問題要麼設置CHARSET到Charset.Unicode或編組爲UnmanagedType.LPArray,但我注意到確保修補程序辦理此案。 此外,我在c#中的事件處理新手,我不知道我是否正確地做到了這一點。

 public class StartEventArgs : System.EventArgs 
{ 
    private GPIOapi.PIN_GPIO_PORT port; 
    private uint pin; 
    public StartEventArgs(GPIOapi.PIN_GPIO_PORT port,uint pin) 
    { 
     this.port = port; 
     this.pin = pin; 
    } 
} 

public delegate void StartEventHandler(StartEventArgs e); 

public class GPIO_In 
{ 
    public event StartEventHandler TriggerDown; 
    public event StartEventHandler TriggerUp; 

    protected virtual void OnTriggerDown(StartEventArgs e) 
    { 
     if (TriggerDown != null) 
      TriggerDown(e); 
    } 

    protected virtual void OnTriggerUp(StartEventArgs e) 
    { 
     if (TriggerUp != null) 
      TriggerUp(e); 
    } 

    public void DoTrigger(GPIOapi.PIN_GPIO_PORT port, uint pin) 
    { 
     OnTriggerDown(new StartEventArgs(port, pin)); 
     //.... 
     OnTriggerUp(new StartEventArgs(port, pin)); 
    } 
} 

    private GPIO_In input; 

    public Form1() 
    { 
     InitializeComponent(); 
     input=new GPIO_In(); 
     connect(); 
    } 

    void connect() 
    {input.TriggerDown+=new StartEventHandler(this.Check);} 

    private void Check(StartEventArgs e) 
    { 
     GetInput(pin1, port6, pin_level); 
    } 

有沒有人有任何想法如何使用此功能,他們是否會足夠分享一些他們的經驗?謝謝。 一些資源我已經厭倦了:

http://msdn.microsoft.com/en-gb/library/aa288459(v=vs.71).aspx 
http://msdn.microsoft.com/en-gb/library/aa645739(v=vs.71).aspx 
http://stackoverflow.com/questions/7609225/c-to-c-sharp-event-handling 
http://stackoverflow.com/questions/17073386/raise-events-in-c-cli-dll-and-consume-in-c-sharp 
http://stackoverflow.com/questions/12576944/triggering-event-in-c-sharp-from-c-dll 
http://www.codeproject.com/Questions/155043/Raise-C-event-and-catch-in-C 
http://stackoverflow.com/questions/2969654/how-to-marshall-a-lpcwstr-to-string-in-c 
http://www.codeproject.com/Questions/460787/Which-data-type-in-Csharp-equivalent-with-LPCWSTR 
http://msdn.microsoft.com/En-US/library/aa288468(VS.71).aspx#pinvoke_example1 

編輯*:不知道如果我得到了所有權的權利,但澄清:我想觸發使用上述功能(我認爲這是在C#中的事件用C++編寫)

+2

我真的不明白你以後...您的代碼不調用'GpioSetupInterruptPin',而這個函數不能有C#事件的任何知識。你必須傳遞一個回調函數才能觸發任何東西。我猜'szEventName'是一些其他類型的事件,而不是C#事件。 – 2014-11-24 15:00:31

+0

GpioSetupInterruptPin是設置功能,我在我的勝利表單初始化後調用它。據我所知,可能有一個事件在DLL中產生中斷,我不得不將它委託給我想要執行的方法。我認爲這是類似於這樣的問題:[鏈接](http://stackoverflow.com/questions/12576944/triggering-event-in-c-sharp-from-c-dll?lq=1),但我想不出瞭解如何將它作爲szEventName傳遞。我一直在爲此掙扎大約一週,而我可能最終會迷惑自己 – 2014-11-24 15:21:33

回答

1

您的代碼不會展現給GpioSetupInterruptPin關鍵的呼叫。這就是說,我認爲你太過複雜了。只需將其定義爲一個字符串並完成它。

而且,我沒有看到你創建在你的代碼命名的系統事件。您發佈的事件處理程序等與問題無關。您需要做的是P/Invoke CreateEvent,您傳遞給設置API的字符串名稱相同,然後在該調用返回的句柄上使用WaitForSingleObject

open-source SDF在管理對象OpenNETCF.THreading.EventWaitHandle中提供了這些內容,如果您不想自己寫。

+0

謝謝。我意識到我有多愚蠢 – 2014-11-26 09:29:26