Очистить очередь ответов GPIB

Архитектура -> GBIP из внешнего интерфейса подключается к целевой (linux) системе через шину gpib. Внутри коробки Linux есть кабель Ethernet от GPIB до материнской платы.

Карта PIC_GPIB на внешнем интерфейсе соответствует стандарту IEEE 488.2.

Я отправляю запрос из внешнего интерфейса в Linux.

Несколько сценариев

1) Если я отправлю запрос, который не ожидает ответа, то следующая отправка запроса будет работать.

2) Если я отправляю запрос, который ожидает ответа, и когда я получил ответ и прочитал его, а затем запустил следующий запрос, он работает нормально.

3) НО, если я отправляю запрос из внешнего интерфейса и получаю ответ, игнорируя его, чтобы прочитать ответ, следующий запрос завершится ошибкой. Я прошу помощи по сценарию 3.

Кодирование выполняется на стороне Linux, и это программирование сокетов, которое использует встроенную функцию linux из unistd.h для чтения и записи.

Мое расследование: я обнаружил, что на карте gbib на внешнем интерфейсе есть внутренняя память, которая хранит значение предыдущего ответа до тех пор, пока мы не получим чтение. Обычно я использую служебную программу для строк IEEE, чтобы писать команды, которые поступают в Linux, и читать репозиторий с помощью кнопки чтения.

Может ли кто-нибудь указать мне, как очистить входной буфер или память, в которой хранится значение, чтобы запись из внешней команды продолжалась, не беспокоясь о ее чтении.

Мой код на стороне Linux был разработан на C ++ и программировании сокетов. Я использовал функцию записи и чтения Bulit для записи и чтения на gpib и json-сервер.

Пример кода показан ниже

    bool GpibClass::ReadWriteFromGPIB()
{
  bool check = true;
  int n = 0;
  char buffer[BUFFER_SIZE];
  fd_set read_set;
  struct timeval lTimeOut;

  // Reset the read mask for the select
  FD_ZERO(&read_set);
  FD_SET(mGpibFd, &read_set);
  FD_SET(mdiffFd, &read_set);

  // Set Timeout to check the status of the connection
  // when no data is being received
  lTimeOut.tv_sec = CONNECTION_STATUS_CHECK_TIMEOUT_SECONDS;
  lTimeOut.tv_usec = 0;

  cout << "Entered into this function" << endl;

  // Look for sockets with available data
  if (-1 == select(FD_SETSIZE, &read_set, NULL, NULL, &lTimeOut))
  {
    cout << "Select failed" << endl;

    // We don't know the cause of select's failure.
    // Close everything and start from scratch:
    CloseConnection(mGpibFd);
    CloseConnection(mdifferntServer); // this is different server

    check = false;
  }

  // Check if data is available from GPIB server,
  // and if any read and push it to gpib
  if(true == check)
  {
    cout << "Check data from GPIB after select" << endl;

    if (FD_ISSET(mGpibFd, &read_set))
    {
      n = read(mGpibFd, buffer, BUFFER_SIZE);

      cout << "Read from GPIB" << n << " bytes" << endl;

      if(0 < n)
      {
        // write it to different server and check if we get response from it
      }
      else
      {
        // Something failed on socket read - most likely
        // connection dropped. Close socket and retry later
        CloseConnection(mGpibFd);

        check = false;
      }
    }
  }

  // Check if data is available from different server,
  // and if any read and push it to gpib
  if(true == check)
  {
    cout << "Check data from diff server after select" << endl;

    if (FD_ISSET(mdiffFd, &read_set))
    {
      n = read(mdiffFd, buffer, BUFFER_SIZE);

      cout << "Read from diff servewr " << n << " bytes" << endl;

      if (0 < n)
      {
        // Append, just in case - makes sure data is sent.
        // Extra cr/lf shouldn't cause any problem if the json
        // server has already added them
        strcpy(buffer + n, "\r\n");

        write(mGpibFd, buffer, n + 2);
        std::cout <<" the buffer sixze  = " << buffer << std::endl;

      }
      else
      {
        // Something failed on socket read - most likely
        // connection dropped. Close socket and retry later
        CloseConnection(mdiffFd);

        check = false;
      }
    }
  }

  return check;
}

person samantha    schedule 20.07.2012    source источник
comment
Этот текст так сбивает с толку .. Пожалуйста, попробуйте перефразировать ...   -  person RedX    schedule 20.07.2012


Ответы (1)


Обычно вам следует читать ответы после любой операции, которая могла их сгенерировать.

Если вы этого не сделаете, простым решением будет считывание ответов в цикле, пока вы не опустошите очередь.

Вы можете сбросить прибор (возможно, * RST), но вы, вероятно, потеряете и другое состояние. Вам нужно будет проверить его документацию, чтобы увидеть, есть ли команда для сброса только очереди ответов. Проверка документации - это всегда хорошая идея, потому что количество инструментов, которые точно соответствуют спецификации, затмевается количеством, которое уникальным образом дополняет или опускает части.

person Chris Stratton    schedule 20.07.2012
comment
Спасибо за совет, я опубликовал свой образец кода, но думаю, он не работает должным образом. - person samantha; 20.07.2012