我目前正在编写一个MATLAB代码来控制安装在机械臂末端的仪器。我正在通过TCP/IP以太网连接访问机器人的位置数据。通讯系统正常工作。数据在XML文件包中传输。我已经编写了一个解析脚本来从流中提取正确的数据。
但是,当我尝试添加更多命令(例如控制仪器)时,我的代码不能正常工作。问题是缓冲区充满了来自机器人的一定(大量)数据,当我调用in.readLine
命令时,它读取缓冲区的下一行,而不是通过连接接收的最新行。如果程序一直忙于做其他事情(由pause(0.01)
命令模拟),则显示的位置数据可能会非常落后于机器人的实际位置。如果机器人保持静止,数据最终会跟上。没有刷新BufferedReader的命令,我也找不到使用reset和mark命令的方法,因为这似乎重置为缓冲区中较早的数据字符串。有没有办法访问从以太网通信不断更新的缓冲区中的最新数据?
我不能删除缓冲区并创建新的缓冲区,因为这会中断与机器人的连接,并导致其程序失败。
很抱歉下面的代码,这是一个正在进行中的工作,所以请原谅它的粗糙和准备。使用mark和reset命令注释掉的代码只是我尝试使用它们的一次尝试。我还尝试了调整缓冲区的大小,使其不断溢出并“刷新”自己,但即使将缓冲区大小设置为最小的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
https://stackoverflow.com/questions/9573702
复制相似问题