jSerialComm Сбой последовательной связи с Arduino UNO - PullRequest
0 голосов
/ 15 октября 2018

Я работаю над небольшим проектом, в котором я хочу общаться с Arduino UNO через последовательный интерфейс.Чтобы привыкнуть к библиотеке (я использую jSerialComm), я попытался написать простой пример, но даже эта простая программа не работает должным образом.Arduino запускает простой набросок, который просто возвращает значение, отправленное компьютером:

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

}

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

Он отлично работает, когда я отправляю значения на него через встроенный последовательный монитор.

MyКажется, проблема в 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 * ​​1046 * 23
24
25
w
return: 25
return: 0

Этот код должен немедленно возвращать значение, отправленное компьютером, но ist - нет.Он прекрасно работает, когда я использую последовательный монитор, встроенный в Arduino IDE, а также с любым другим последовательным монитором, который я пробовал.

1 Ответ

0 голосов
/ 03 ноября 2018

Я решил проблему с помощью цикла while для отправки запроса, пока не получу желаемый ответ.Весь проект можно найти на GitHub: https://github.com/SF2311/ArduinoUI

...