在一个类中,我有一个构造函数,它接收一个需要初始化的SerialPort
对象。作为初始化的一部分,订户方法被添加到DataReceived
事件中。当它作为标准Windows窗体应用程序执行时,它按预期工作。
但是我也将把这个类用作可以从VBScript调用的COM对象。
我的问题是,当我将代码作为Windows窗体应用程序运行时,它运行良好。但是当它被用作COM对象时,订阅者方法被“忽略”。
为了测试这个,我添加了一些messagebox.show()
次来电,我得到的结果如下。
当作为Windows Forms App运行时,我会看到“Set subscriber method”消息,当在串口上收到数据时,我会看到“Found data”消息。 当作为COM对象调用时,我会看到“设置订阅者方法”消息,但不会看到“找到数据”消息。
我的想法已经用完了,我在网上找不到任何可以建议订阅COM对象中的事件应该与订阅Windows窗体应用程序中的事件不同的东西。
我在这里错过了什么吗?
//Constructor
public RFIDBoard(SerialPort mSerialPort)
{
UUIDonBoard = new byte[SetUpValues.NUM_BYTES_IN_RFID_UUID];
HoldsAProductRFID = false;
sp = mSerialPort;
sp.BaudRate = 9600;
sp.StopBits = StopBits.One;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.ReceivedBytesThreshold = 4;
MessageBox.Show("Set subscriber method");
sp.DataReceived += Sp_DataReceived;
}
//Subscriber method when data is received
private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
MessageBox.Show("Found data");
GetDataFromPort();
if (OnBoardStatusChange != null)
OnBoardStatusChange(this, e);
}
修改 添加了用于创建COM对象的VBSCript。
Dim oArduino
'Create COM object
Set oArduino = WScript.CreateObject("ArduinoRFID")
'Show main form that pick up serial data
oArduino.ShowMe()
Loopit = True
'Start loop and look for new data
Do While Loopit
'If boolean IsDataReady in COM object is true then new data has arrived
If oArduino.IsDataReady = True Then
theBoard1 = oArduino.Prod1
theBoard2 = oArduino.Prod2
theBoard3 = oArduino.Prod3
'Reset IsDataReady
oArduino.IsDataReady = False
end If
'Limit the stress on COM by only asking twice a minute for new data
WScript.Sleep(500)
Loop