簡體   English   中英

C++ DLL function 似乎在 ZD7EFA19FBE7D3972745ADB602Z223 中不起作用

[英]C++ DLL function does not seem to work in C#

我已經使用 C# 和bird.dll開發了一個小程序,但是birdRS232WakeUp() function 似乎不起作用。

當我在 C++ 中調用birdRS232WakeUp() function 時,程序將停止一段時間(8-10 秒)。 看起來它正在開始做與硬件連接的過程(鳥群)。

但在 C# 中,調用birdRS232WakeUp()時不會停止。 我該如何解決這個問題?

C# 代碼如下所示。

[DllImport(@"Bird.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool birdRS232WakeUp(int nGroupID, Boolean  bStandAlone, int nNumDevices,
                                          ref ushort[] pwComport, uint dwBaudRate,
                                          uint dwReadTimeout, uint dwWriteTimeout);

ushort[] COM_port = new ushort[]{0,16,0,0,0};
if ((!birdRS232WakeUp(GROUP_ID, false, DEVCOUNT, ref COM_port, BAUD_RATE, READ_TIMEOUT, WRITE_TIMEOUT)))
{
    LWakeUpStatus.Text = "Failde to wake up FOB";
}

C++ 代碼如下所示。

WORD COM_port[5] = {0,15,0,0,0}

if ((!birdRS232WakeUp(GROUP_ID,
    FALSE, // Not stand-alone
    DEVCOUNT, // Number of Devices
    COM_port, // COM Port
    BAUD_RATE, // BAUD
    READ_TIMEOUT,WRITE_TIMEOUT, // Reponses timeouts
    GMS_GROUP_MODE_ALWAYS)))
{
    printf("Can't Wake Up Flock!\n");
    Sleep(3000);
    exit(-1);}

此 function 的 C++ header 文件:

birdRS232WakeUp(int nGroupID, BOOL bStandAlone, int nNumDevices,
                WORD *pwComport, DWORD dwBaudRate, DWORD dwReadTimeout,
                DWORD dwWriteTimeout, int nGroupMode = GMS_GROUP_MODE_ALWAYS);

並且說明書上寫着“pwComport”指向一個字數組,每個字是COM端口的編號連接到其中一只鳥(例如COM1 = 1,COM2 = 2等)

更新 1:

我接受了elder_george的建議,但問題仍然存在。 我不得不將 C# 代碼更改為以下代碼。

public  static extern bool birdRS232WakeUp(int nGroupID, Boolean  bStandAlone, int nNumDevices,
                           ushort[] pwComport, uint dwBaudRate, uint dwReadTimeout,
                           uint dwWriteTimeout,int nGroupMode);

if ((!birdRS232WakeUp(GROUP_ID, false, DEVCOUNT, COM_port, BAUD_RATE, READ_TIMEOUT, WRITE_TIMEOUT,2)))
{
    LWakeUpStatus.Text = "Failde to wake up FOB";
}

順便說一句,int nGroupMode 等於 2,基於下面的枚舉類型。

enum GroupModeSettings
{
    //    GMS_DEFAULT,         // Driver will determine whether or not to use RS232 group mode.
    GMS_GROUP_MODE_NEVER,      // RS232 group mode will never be used
    GMS_GROUP_MODE_ALWAYS,     // RS232 group mode will always be used
    NUM_GROUP_MODE_SETTINGS
};

不確定這些點是否能解決您的問題,但是:

1) pwComport應聲明為ushort[] pwComport ,而不是ref ushort[] pwComport

2)您需要從 C# 傳遞nGroupMode參數。 如果您使用 C#4,您可以將其設置為默認值,但不要忽略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM