Проблема связи через RS232 - VB.net DLL / Delphi Win32 EXE - PullRequest
1 голос
/ 23 сентября 2011

У меня есть программа 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;

1 Ответ

0 голосов
/ 24 сентября 2011

TxResult = source.InputStreamString

Dim sRead As String = moRS232.InputStreamString

Я не использую VB.net, но выглядит так, как будто вы пытаетесь прочитать полученноебуфер дважды.Разрешает ли это InputStreamString или при чтении он пуст?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...