2011-09-23 83 views
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; 
+0

在Delphi程序中直接使用串口不是更簡單嗎? – Robert

+0

同意羅伯特。嘗試通過Dejan Crnila(http://sourceforge.net/projects/comport/)或ASYNCPro(http://sourceforge.net/projects/tpapro/)的TComPort進行串行通信。這些工具通常很容易用於基本的串行通信。我在項目中都成功地使用了各種無線電和rs232設備。混合VB dll和Delphi的工作,但你通常應該找到更好的原生Delphi解決方案。這兩個提到的控件都是開源的。你認爲「絕對正確地溝通」,或許不是。 – SteveJG

回答

0

TxResult = source.InputStreamString

昏暗SREAD作爲字符串= moRS232.InputStreamString

我不使用VB.net,但它看起來好像你可能試圖r接收緩衝區兩次。 InputStreamString是否允許這樣做,還是在讀取時爲空?