1
我有一個Delphi程序,與我創建的vb.net DLL進行通信。 vb.net dll通過RS232連接與Fluke示波器通信。我創建了一個可以通過RS232正確通訊的程序,給了我預期的價值。雖然,當我將它打包爲一個dll並從我的Delphi程序中訪問dll時,我總是收到「1」的值,而不是我期望的值(大多數情況下的值在240左右)。問題通過RS232通信 - VB.net DLL /德爾福win32 exe
我知道我的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;
在Delphi程序中直接使用串口不是更簡單嗎? – Robert
同意羅伯特。嘗試通過Dejan Crnila(http://sourceforge.net/projects/comport/)或ASYNCPro(http://sourceforge.net/projects/tpapro/)的TComPort進行串行通信。這些工具通常很容易用於基本的串行通信。我在項目中都成功地使用了各種無線電和rs232設備。混合VB dll和Delphi的工作,但你通常應該找到更好的原生Delphi解決方案。這兩個提到的控件都是開源的。你認爲「絕對正確地溝通」,或許不是。 – SteveJG