Архитектура -> 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;
}