У меня есть программа Delphi, которая связывается с созданной мной dll vb.net.DLL vb.net связывается с измерителем объема Fluke через соединение RS232.Я создал программу, которая правильно связывается через RS232, давая мне ожидаемое значение.Хотя, когда я упаковываю это как dll и получаю доступ к dll из моей программы на Delphi, я всегда получаю значение «1», а не значение, которое я ожидал (в большинстве случаев это значение около 240).
Я знаю, что моя программа delphi определенно правильно связывается с dll и что моя dll определенно связывается с измерителем объема.Это просто значение, которое возвращается, что является проблемой!Надеюсь, я просто сделал что-то очень глупое здесь, но я не вижу этого, и это начинает сводить меня с ума!
Вот мой код vb.net:
Public Interface IFlukeComm
Function GetReading(ByVal Command As String, ByVal PortNum As Integer) As String
Function Test() As String
End Interface
Public Class FComm : Implements IFlukeComm
Private WithEvents moRS232 As Rs232
Dim InvokeRequired As Boolean
Dim TxResult As String
Private Sub OpenCom(ByVal PortNum As Integer)
Dim sTx As String
moRS232 = New Rs232()
Try
With moRS232
.Port = PortNum
.BaudRate = 1200
.DataBit = 8
.StopBit = Rs232.DataStopBit.StopBit_1
.Parity = Rs232.DataParity.Parity_None
.Timeout = 1500
End With
moRS232.Open()
moRS232.Dtr = True
moRS232.Rts = True
moRS232.EnableEvents()
moRS232.PurgeBuffer(Rs232.PurgeBuffers.TxClear Or Rs232.PurgeBuffers.RXClear)
sTx = "PC 9600"
sTx += ControlChars.Cr
moRS232.Write(sTx)
moRS232.Close()
Catch ex As Exception
End Try
End Sub
Private Sub moRS232_CommEvent(ByVal source As Rs232, ByVal Mask As Rs232.EventMasks) Handles moRS232.CommEvent
If (Mask And Rs232.EventMasks.RxChar) > 0 Then
TxResult = source.InputStreamString
End If
End Sub
Public Function GetReading(ByVal Command As String, ByVal PortNum As Integer) As String Implements IFlukeComm.GetReading
OpenCom(PortNum)
Threading.Thread.Sleep(500)
With moRS232
.Port = PortNum
.BaudRate = 9600
.DataBit = 8
.StopBit = Rs232.DataStopBit.StopBit_1
.Parity = Rs232.DataParity.Parity_None
.Timeout = 1500
End With
moRS232.Open()
moRS232.Dtr = True
moRS232.Rts = True
moRS232.EnableEvents()
Command += ControlChars.Cr
moRS232.Write(Command)
Threading.Thread.Sleep(500)
moRS232.Close()
If TxResult <> "" Then
'moRS232.Read(10)
Dim sRead As String = moRS232.InputStreamString
Return sRead
Else
Return "Invalid"
End If
End Function
Public Function Test() As String Implements IFlukeComm.Test
Return "Success"
End Function
End Class
Здесьмой код Delphi:
procedure TfrmLauncher.btnM1UNClick(Sender: TObject);
begin
ShowMessage(GetMeasurements('QM 11',cmbM1PC.ItemIndex + 1));
end;
function TfrmLauncher.GetMeasurements(strType : string; iPort : Integer) : string;
var
IFC : IFlukeComm;
begin
IFC := CreateComObject(CLASS_FComm) as IFlukeComm;
Result := IFC.GetReading(strType,iPort);
end;