我正在尝试使用PC Java通过Arduino Uno控制小型直流电动机。此Java应用程序是服务器应用程序,并使用套接字与android应用程序连接。它适用于Java的单个命令。但是无法持续按下。当我连续按下按钮并停止向上按时,我想旋转电机。请帮我。

这是android代码。 /连续按/

   class RepetitiveUpdater implements Runnable {

        @Override
        public void run() {
            if (autoIncrement) {
                increment();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY);
            } else if (autoDecrement) {
                decrement();
                repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY);
            }
        }

    }

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            increment();
        }
    });

    btn.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            autoIncrement = true;
            repeatUpdateHandler.post(new RepetitiveUpdater());
            return false;
        }
    });

    btn1.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            autoDecrement = true;
            repeatUpdateHandler.post(new RepetitiveUpdater());
            return false;
        }
    });


这是Java服务器。

private void sendMsgToPort(int k) {
    try {
        String s = String.valueOf(k);
        char buf2[] = s.toCharArray();
        serialPort.writeByte((byte) buf2[0]);
    } catch (SerialPortException ex) {
        System.out.println(ex);
    }
}

// ........
        while (true) {
            try {

                clientSocket = serverSocket.accept(); // accept the client connection
                inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader); // get the client message
                message = bufferedReader.read();
                sendMsgToPort(message);
                System.out.println("m=:" + message);
               // System.out.println("Serial : "+serialPort.readString());
                //inputStreamReader.close();
               // clientSocket.close();
                //System.out.println(serialPort.readBytes());
                //Thread.sleep(100);

            } catch (IOException ex) {
                // status.setText("Error: " + ex);
                System.out.println("Problem in message reading");
            }
        }


这是ardiuno示例代码:

int val = 0;
int led = 8;

void setup()
{
   Serial.begin(9600);
   pinMode(led, OUTPUT);
}

void loop()
{
   delay(100);
}

void serialEvent() // To check if there is any data on the Serial line
{
   if (Serial.available())
   {
       val = Serial.parseInt();
       if(val == 1)   //Switch on the LED, if the received value is 1.
       {
          digitalWrite(led, HIGH);
       }
   }

}


`

最佳答案

您的Java服务器程序中存在一个问题:

clientSocket = serverSocket.accept();

您接受一个新的连接,阅读/处理一条消息,然后?
该客户端套接字刚刚超出范围。该连接只是保持打开状态,您的代码再次等待新的连接。

搜索“ Java多线程服务器”示例,这确实很容易。接受后,请在专用线程中完全处理每个连接,以便您既可以等待另一个连接,也可以同时处理已建立连接上的较长对话框。

07-24 09:44
查看更多