我已经使用C#和bird.dll
开发了一个小程序,但是birdRS232WakeUp()
函数似乎无法正常工作。
当我在C ++中调用birdRS232WakeUp()
函数时,程序将停止一段时间(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);}
此功能的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)pwComport
应该声明为ushort[] pwComport
,而不是ref ushort[] pwComport
2)您需要从C#传递nGroupMode
参数。如果使用C#4,则可以将其设置为默认值,但不要完全忽略它。