В настоящее время я пишу код MATLAB для управления инструментами, установленными на конце манипулятора.Я получаю доступ к позиционным данным робота через соединение TCP / IP Ethernet.Ком работают.Данные передаются в пакетах файлов XML.Я написал скрипт синтаксического анализа для извлечения правильных данных из потока.
Однако, когда я пытаюсь добавить больше команд (например, для управления инструментами), мой код работает неправильно.Проблема в том, что буфер заполняется определенным (большим) объемом данных от робота, и когда я вызываю команду in.readLine
, он читает следующую строку буфера, а не самую последнюю строку, полученную по соединению.Если программа была занята другими делами (смоделированными с помощью команды pause(0.01)
, то отображаемые позиционные данные могут сильно отставать от того, где на самом деле находится робот. Если робот остается неподвижным, данные в конечном итоге, однако, догоняют. Команды нетсбросить BufferedReader, и я не могу найти способ использовать команды сброса и пометки для работы, поскольку это, кажется, сбрасывает в более раннюю строку данных в буфере. Есть ли способ доступасамые последние данные в буфере, который постоянно обновляется из коммуникаций Ethernet?
Я не могу удалить буфер и создать новый, так как это разрывает соединение с роботом и вызывает сбой его программы.
Извините за приведенный ниже код, он находится в стадии разработки, поэтому извините за грубость и готовность. Код, закомментированный с помощью команд mark и reset, является лишь одной попыткой их использования, которую я пробовал. Iтакже пытался поиграть с размером буфера, чтобы он постоянно переполняли сам "сбросить", но даже с размером буфера, установленным на его наименьшее из 1, проблема все еще сохраняется.
clear all; close all; clc;
import java.net.*;
import java.io.*;
import java.lang.System;
PORT = 6008;
try
server_socket = ServerSocket(PORT);
disp('Server started, awaiting connections...')
client_socket = server_socket.accept;
in = BufferedReader(InputStreamReader(client_socket.getInputStream));
% m = in.markSupported;
% if(m == 1)
% disp('Mark supported');
% end
% in.mark(8192);
while 1
XMLdata = in.readLine; %Reads the next line in the buffer
[test, bin]=strtok(char(XMLdata)); %
if strcmp(test, '<RIst') == 1 %Tests to see if it is a line with positional data
rsi_parse %If so, parses the data into an array
% in.reset;
% in.mark(8192);
end
pause(0.01) %Pause to simulate other commands which cause the buffer to fill up
end
catch
disp('Error. Closing connection.')
closeConnections(server_socket, client_socket, in);
end