C ++ DLL функция не работает в C # - PullRequest
0 голосов
/ 01 июня 2011

Я разработал небольшую программу с использованием C # и bird.dll, но функция birdRS232WakeUp(), похоже, не работает.

Когда я вызываю функцию birdRS232WakeUp() в C ++, программа останавливается длявремя (8-10 секунд).Похоже, что он начинает делать процесс, соединяющийся с оборудованием (Flock of bird).

Но в 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);}

C ++заголовочный файл для этой функции:

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 Ответ

1 голос
/ 01 июня 2011

Не уверен, что эти пункты решат вашу проблему, но:

1) pwComport должен быть объявлен как ushort[] pwComport, а не ref ushort[] pwComport

2) вам нужно передать параметр nGroupMode из C #. Вы можете установить значение по умолчанию, если вы используете C # 4, но не игнорируйте его вообще.

...