jSerialComm与Arduino UNO的串行通信失败

时间:2018-10-15 18:32:36

标签: java arduino serial-port arduino-uno

我正在做一个小项目,我想通过串行接口与Arduino UNO进行通信。为了适应该库(我正在使用jSerialComm),我尝试编写一个简单的示例,但是即使这个简单的程序也无法按预期工作。 Arduino运行一个简单的草图,该草图仅返回计算机发送的值:

void setup() {
  Serial.begin(9600);

}

void loop() {
  if(Serial.available())
  Serial.println(Serial.read());
}

当我通过内置的串行监视器将值发送给它时,它工作得很好。

我的Java代码似乎是问题所在,但我无法弄清楚:

public static void main(String[] args){
    SerialPort port = SerialPort.getCommPort("COM5");
    port.setComPortParameters(9600,8,1,0);
    port.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING,0,0);
    System.out.println("Open port: " + port.openPort());
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Scanner in = new Scanner(port.getInputStream());
    PrintWriter out = new PrintWriter(port.getOutputStream(),true);

   out.println('a');
   out.flush();
    System.out.println("> w");

    while (in.hasNextLine())
        System.out.println("return: " +in.nextLine());
}

我将不胜感激。 谢谢您的答复。

编辑:

玩完这些代码后,经过多次请求,我最终得到了回应。有人知道如何解决这个问题吗?新代码:

package sample;

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

import java.io.PrintWriter;
import java.util.Scanner;
public class Test {
    static boolean received;
    public static void main(String[] args) {
        SerialPort port = SerialPort.getCommPort("COM5");
        port.setComPortParameters(9600,8,1,0);
        port.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER,0,0);
        System.out.println("Open port: " + port.openPort());
        Scanner in = new Scanner(port.getInputStream());
        PrintWriter out = new PrintWriter(port.getOutputStream(),true);
        port.addDataListener(new SerialPortDataListener() {
            @Override
            public int getListeningEvents() {
                return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
            }

            @Override
            public void serialEvent(SerialPortEvent serialPortEvent) {
                String input = "";

               input = in.nextLine();

                System.out.println("return: " + input);
                received=true;
            }
        });


int counter =0;
        while(!received) {
            System.out.println(counter);
            out.println(counter);
            out.flush();
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            counter++;
        }
        out.println('w');
        System.out.println("w");
           /*     String input = in.nextLine();
                System.out.println("return: "+input+input.isEmpty());*/
    }
}

Arduino上的代码:

void setup() {
  Serial.begin(9600);

}
byte in;
int count=0;
void loop() {
  if(Serial.available()){
    Serial.print(Serial.parseInt());
    Serial.print('\n');
  }
}

结果控制台输出:

  

打开端口:true       0
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      w
      返回:25
      返回:0

此代码应立即返回计算机发送的值,而ist不会。当我使用Arduino IDE内置的串行监视器以及我尝试过的所有其他串行监视器时,它都可以正常工作。

1 个答案:

答案 0 :(得分:0)

我使用while循环发送请求来解决问题,直到收到所需的响应为止。整个项目可以在GitHub上找到:https://github.com/SF2311/ArduinoUI