相关疑难解决方法(0)

Thread.sleep的准确度如何?

我正在研究计算机硬件,我们了解到使用硬件计时器可获得比软件延迟更准确的结果.我已经在汇编中写了1毫秒的软件延迟,我可以开始一个使用这个延迟重复每个毫秒的过程,并且计数器每100毫秒做一次其他事情,这种技术不如使用我的硬件计时器那么精确内置了我现在要使用的硬件.

所以我想知道用Java构建的时序有多精确?我们有System.currentTimeMillis并且Thread.sleep这些可能不使用硬件定时器,那么这些内置Java方法与硬件定时器相比有多准确?

java timing

20
推荐指数
2
解决办法
7639
查看次数

如何正确地与3D打印机通信

我必须编写一个java程序,通过网络接收G-Code命令,并通过串行通信将它们发送到3D打印机.原则上一切似乎都没问题,只要打印机需要超过300毫秒来执行命令.如果执行时间短于此时间,则打印机接收下一个命令需要花费太多时间,并且导致命令执行之间的延迟(打印机喷嘴静止约100-200ms).这可能会成为3d打印中的问题所以我必须消除这种延迟.

为了比较:像Repetier Host或Cura这样的软件可以通过seial发送相同的命令,命令执行之间没有任何延迟,所以它必须以某种方式.

我使用jSerialComm库进行串行通信.

这是将命令发送到打印机的线程:

@Override
public void run() {
if(printer == null) return;
    log("Printer Thread started!");
    //wait just in case
    Main.sleep(3000);

    long last = 0;
    while(true) {

        String cmd = printer.cmdQueue.poll();
        if (cmd != null && !cmd.equals("") && !cmd.equals("\n")) {
            log(cmd+" last: "+(System.currentTimeMillis()-last)+"ms");
            last = System.currentTimeMillis();
            send(cmd  + "\n", 0);
        }

    }
}

private void send(String cmd, int timeout) {
    printer.serialWrite(cmd);
    waitForBuffer(timeout);
}

private void waitForBuffer(int timeout) {
    if(!blockForOK(timeout))
        log("OK Timeout ("+timeout+"ms)");
}

public boolean blockForOK(int timeoutMillis) …
Run Code Online (Sandbox Code Playgroud)

java serial-port serial-communication 3d-printing

6
推荐指数
1
解决办法
508
查看次数