проблемы с получением данных delphi TIdUdpClient - PullRequest
0 голосов
/ 19 июня 2020

У меня UDP-соединение с элементом управления Wa go с помощью Modbus / UDP, и у меня были большие проблемы с TIdUdpClient.

Проблема заключалась в том, что отправка данных всегда работала, но компонент не получал никаких данных , даже пакет ответа был четко виден в WireShark.

Я долго искал, пока не обнаружил, что массив буфера приема ДОЛЖЕН быть установлен на ожидаемую длину данных (НЕ 0), иначе клиент не получит НИКАКОГО data.

Просто хочу, чтобы другие не искали часы.

Примечание: получение содержит проверку бита ошибки для кода функции Modbus. можно игнорировать, если вы передаете данные, отличные от Modbus

Пример рабочего кода:

function TWagoIO.sendCommand (arucTX : array of Byte;     uiTXLen : integer;
                          var arucRX : array of Byte; var uiRXLen : integer) : boolean;
var
  clSocket   : TIdUdpClient;
  arTXBuff   : TIdBytes;
  arRXBuff   : TIdBytes;
  iIndex     : integer;
  iByteCount : integer;
  strPeerIP  : string;
  uiPeerPort : word;
  bRetValue  : boolean;

begin

  bRetValue := true;

  clSocket := TIdUdpClient.Create (nil);

  SetLength(arTXBuff, uiTXLen);

  for iIndex := 0 to (uiTXLen - 1) do
  begin
    arTXBuff [iIndex] :=  arucTX [iIndex];
  end;

  clSocket.Host := strIPAddress;
  clSocket.Port := uiPortNum;

  clSocket.SendBuffer(strIPAddress, uiPortNum, arTXBuff);

  SetLength(arRXBuff, 1024);
  strPeerIP  := '';
  uiPeerPort := 60000;
  Sleep (100);
  uiRXLen := clSocket.ReceiveBuffer(arRXBuff, strPeerIP, uiPeerPort, 3);
  if (uiRXLen > 7) then
  begin
    for iByteCount := 0 to uiRXLen do
    begin
      arucRX [iByteCount] := arRXBuff [iByteCount];
    end;

    if ((arucRX [7] and C_FC_ERROR_FLAG) = C_FC_ERROR_FLAG)  then
    begin
      bRetValue := false;
    end;
  end
  else
  begin
    bRetValue := false;
  end;
  clSocket.Destroy;

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