gpt4 book ai didi

java - 在 Matlab 中使用 java BufferedRead 和 TCP/IP 以太网连接 - 访问最新数据

转载 作者:行者123 更新时间:2023-12-01 05:26:53 24 4
gpt4 key购买 nike

我目前正在编写 MATLAB 代码来控制安装在机械臂末端的仪器。我正在通过 TCP/IP 以太网连接访问机器人的位置数据。通讯器正在工作。数据以XML文件包的形式传输。我编写了一个解析脚本来从流中提取正确的数据。

但是,当我尝试添加更多命令(例如控制仪器)时,我的代码无法正常工作。问题是缓冲区填满了来自机器人的一定(大量)数据,当我调用 in.readLine 命令时,它会读取缓冲区的下一行,而不是最新的一行通过连接收到的线路。如果程序一直忙于做其他事情(由 pause(0.01) 命令模拟,则显示的位置数据可能会远远落后于机器人实际所在的位置。如果机器人保持静止,则数据最终没有命令可以刷新 BufferedReader,而且我找不到使用重置和标记命令工作的方法,因为这似乎重置为缓冲区中较早的数据字符串。 有没有办法访问缓冲区中不断通过以太网通信更新的最新数据?

我无法删除缓冲区并创建新缓冲区,因为这会中断与机器人的连接并导致其程序失败。

对下面的代码表示歉意,这是一项正在进行的工作,所以请原谅它的粗糙和准备。使用标记和重置命令注释掉的代码只是我尝试使用它们的一种尝试。我还尝试调整缓冲区的大小,使其不断溢出并“刷新”自身,但即使将缓冲区大小设置为最小的 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

最佳答案

目前,您正在使用 MATLAB 将 Java 作为脚本语言运行的功能,这是一个很棒的功能。在这样做的同时,您继承了 MATLAB 的“唯一”主要限制,即它是单线程的。有诸如计时器之类的解决方法,但其核心只有一个线程。

为了从机器人获取最新数据,您似乎被迫不断地从数据流中读取。这可以通过创建一个跨线程的纯 Java 类来实现,该类不断从套接字读取并使用最新数据更新类属性。Java 类必须使用 javac 进行编译,才能生成可在 MATLAB 中实例化为对象的类文件。除了启动和停止方法之外,它还应该提供从 MATLAB 脚本调用的 getLatestDate() 方法,以便获取最新数据。

关于java - 在 Matlab 中使用 java BufferedRead 和 TCP/IP 以太网连接 - 访问最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com