首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过TCP/IP以太网连接使用Matlab中的java BufferedRead -访问最新数据

通过TCP/IP以太网连接使用Matlab中的java BufferedRead -访问最新数据
EN

Stack Overflow用户
提问于 2012-03-06 04:44:06
回答 2查看 1.1K关注 0票数 1

我目前正在编写一个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
EN

回答 2

Stack Overflow用户

发布于 2012-03-06 05:10:46

目前,您正在使用MATLAB的功能将Java作为脚本语言运行,这是一个很好的特性。这样做的同时,你继承了MATLAB的“唯一”主要限制,它是单线程的。有像定时器这样的变通方法,但它的核心只有一个线程。

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

票数 0
EN

Stack Overflow用户

发布于 2012-03-06 14:45:51

这听起来像是一个问题:“我如何确保我正在从我的输入流中读取最新的数据,并在需要时丢弃数据”。

如果是这样,那么您将需要使用内部while循环来扩展代码的数据摄取部分:

    while 1
        %
        %  Read until we find the end of the buffer
        %
        XMLdata = in.readLine;  %Reset current line
        foundData = nan;        %Reset value found
        while ~isempty(XMLdata)                 %Loop to the end of the buffer
            [test, bin]=strtok(char(XMLdata));  %Line testing, as before
            if strcmp(test, '<RIst') == 1       
                foundData = rsi_parse           %Store the found data, we may get a more recent version
            end
            XMLdata = in.readLine;              %Try and read another line
        end
        %Do something with foundData

        %
        %Go and perform other work
        %
        pause(0.01)                             %Go and do something else
    end

关于你的评论,你不能“清除”一个BufferedReader,我认为你可以,像这样:

charactersSkipped = in.skip(1000000000);

(如果您直接用Java语言编写,则应使用in.skip(java.lang.Long.MAX_VALUE);,但这会破坏Matlab接口,并以负数的形式发送给Java语言,因此您只需选择适合输入的最大数字。)

但是,在您清除它之后,在找到您要查找的字符模式之前,没有明确的备份方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9573702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档