Arduino到Java的通讯

时间:2018-07-27 17:13:15

标签: java arduino

我将使其简短而简单。我有一个通过串行通信将数据发送到Java脚本的arduino。在开机和休息时,arduino将不可见的数据发送到需要清除/清除等的串行端口。我尝试了从arduino和Java程序进行串行刷新,但似乎都无法正常工作。我的arduino代码和Java代码发布在下面。在此先感谢!

void setup() {

delay(2500);
Serial.begin(9600);
flushreceive();
pinMode(13, OUTPUT);
}


void loop() {

char input;

if (Serial.available()) {
input = Serial.read();

//Turn on the LED.
if(input == '1'){
digitalWrite(13, HIGH);
Serial.print("ON");
flushreceive();
}

//Have the LED blink 10 times.
if(input == '2') {
Serial.print("OX");
for(int i = 0; i < 10; i++) {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(100);
flushreceive();
}
}

 //Turn off the LED.
 if(input == '3') {
 digitalWrite(13, LOW);
 Serial.print("OFF");
 flushreceive();
 }

 } // END IF SERIAL AVAILABLE
 } // END LOOP

 void flushreceive() {
 while(Serial.available())
 Serial.flush();
 }

下面是我的Java代码,当按下按钮时,它将代码发送到arduino,后者打开或关闭LED,而arduino发送回确认OFF或ON,但是我没有收到此消息...要么输入一半字符,要么根本不输入字符。

    //Listener for the blink button.
    btnBlink.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            btnOn.setBackground(null);
            btnBlink.setBackground(Color.yellow);
            btnOff.setBackground(null);
            //Turns on the #13 pin LED and flashes it 10 times.
            if(comPort.isOpen() == true) {
                InputStream inPut = comPort.getInputStream();
                BufferedReader readBuffer = new BufferedReader(new InputStreamReader(inPut));
                //Send a 2 to the Arduino and update the user.
                lblStatus.setText("Status: LED Blinking");
                outPut.print("2");
                outPut.flush();
                 byte[] buffer = new byte[2];
                   try {
                         String message = "OX";
                         int len = inPut.read(buffer);
                             if (len > 0) {
                                            message = new String(buffer);
                                            System.out.println(message);
                                           }


                             if (message.trim().contains("OX")) {
                                btnBlink.setBackground(Color.yellow);
                                outPut.flush();
                               } else {
                                       System.out.println("ERROR!!"));
                                      }

                        } catch (Exception ep) { ep.printStackTrace();   }
                        } else {
                       //Update the status/console if the Arduino hasn't been connected.
                        lblStatus.setText("Status: Connect Arduino");
                        }
                        }
                        });

2 个答案:

答案 0 :(得分:0)

我使用了Arduino Playground和rxtx库中的这段代码来将数据从arduino串行获取到我的Java程序,并且像魔术一样工作。

这两个链接都在这里:

https://playground.arduino.cc/Interfacing/Java

http://rxtx.qbang.org/wiki/index.php/Download

您只需要设置正确的端口号和波特率(因为波特率通常为:9600,对于我来说,不同设备的COM端口可能不同,COM3

答案 1 :(得分:0)

  • 在您的Arduino草图中,注释掉所有“ flushreceive();”,然后在Arduino IDE中上传并打开串行监视器,然后分别键入1和2。

    (我已经使用Arduino UNO测试了您的代码,并且在注释掉所有flushreceive()之后可以正常工作。)

  • 使用非阻塞avdweb_VirtualDelay库而不是延迟。

  • 在Java端使用jssc。jar库进行串行通信。

  • 然后在Java类中实现SerialPortEventListener,然后以serialEvent方法处理接收到的数据。

  • 使用serialPort.readBytes()从Arduino读取。

  • 使用serialPort.writeBytes()写入Arduino。

  • 以及Ardulink库。