有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程。睡眠使我的应用程序崩溃

此应用程序通过usb到串行加密狗与串行设备通信。我已经能够让它处理我的单一查询没有问题,但我有一个命令,将发送多个查询到串行设备和它似乎在我的缓冲区,如果得到超限。以下是我的部分代码:

这是我的阵列,包含20个查询命令:

   String [] stringOneArray = {":000101017d", ":0001060178", ":00010B016C", ":000110017D",
        ":0001150178", ":00011A016C", ":00011F0167", ":0001240178", ":0001290173",
        ":00012E0167", ":0001330178", ":0001380173", ":00013D0167", ":0001420178",
        ":0001470173", ":00014C0167", ":0001510178", ":0001560173", ":00015B0167", ":0001600178"};

以下是我使用阵列的方式:

getVelocitiesButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        ftDev.setLatencyTimer((byte) 16);
        int z;
        for (z = 0; z < 19; z++) {
            String writeData = (String) stringOneArray[z];
            byte[] OutData = writeData.getBytes();
            ftDev.write(OutData, writeData.length());
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) { }
        }
    }
});

不确定代码的其余部分是否必要,但如果需要,将添加它。 所以ftdev是我的串行设备。它向串行设备发送查询命令,以字节为单位接收响应,我使用For循环构建响应,直到所有字节(每个响应31字节),然后我处理该响应,此时它应该从阵列接收第二个查询命令,依此类推,直到发送最后一个命令。。如果我允许FOR循环只发送一个或两个查询,但有更多的数组索引,那么它就崩溃了。我想我只是放慢FOR循环的速度并添加线程。睡眠,但它会冻结应用程序并崩溃。。。有什么好处?有没有其他方法来控制命令发送的速度?我宁愿尽快发送它们,但恐怕我不太懂java。到目前为止,这一直是我完成这个个人项目的主要垫脚石,我被困了两天,一直在研究和尝试解决方案


共 (1) 个答案

  1. # 1 楼答案

    看起来您需要睡眠约1000毫秒(确切地说是950毫秒,因为您的最后一个操作没有发送到串行设备)加上通过串行连接执行写操作所需的时间。那是一段相当长的时间,什么都不做。拆下螺纹。sleep(50)调用并将onClick的全部内容放入以下代码的run方法中:

    AsyncTask.execute(new Runnable {
        @Override
        public void run() {
            // talk to device here
        }
    });
    

    然后,问一个不同的问题,关于快速写作会破坏你的连接