Чтение с последовательного порта дает разделенную строку - PullRequest
0 голосов
/ 28 февраля 2019

Я использую класс JSSC для получения строки из Arduino Uno.Arduino подключен к моему компьютеру через COM3.В void настройки на Arduino он отправляет строку в java-программу, сообщающую, что Arduino готов к считыванию последовательных данных.Когда java-программа читает последовательный порт, она разбивает строку из Arduino на несколько строк с пробелами.Я предполагаю, что Java-программа печатает данные, когда они получены, а не ждет полной строки.Как я мог сделать так, чтобы программа считывала строку из Arduino и сохраняла ее в строку, а затем печатала на консоли.

Java:

package jtac;

import jssc.*;

public class JTAC {

    public static SerialPort serialPort = new SerialPort("COM3");
    public static PortReader portreader = new PortReader(serialPort);
    public static boolean ready = false;

    public static void main(String[] args) {
        try {
            serialPort.openPort();//Open serial port
            //Thread.sleep(2000);
            serialPort.setParams(SerialPort.BAUDRATE_9600, 
                                 SerialPort.DATABITS_8,
                                 SerialPort.STOPBITS_1,
                                 SerialPort.PARITY_NONE);//Set params. Also you can set params by this string: serialPort.setParams(9600, 8, 1, 0);
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            serialPort.addEventListener(portreader, SerialPort.MASK_RXCHAR);
            while(!ready) {} //Wait for Arduino to fire up
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }   

    }

}
class PortReader implements SerialPortEventListener {

    SerialPort serialPort;
    public PortReader(SerialPort serialPort) {
        this.serialPort = serialPort;
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR() && event.getEventValue() > 0) {
            try {
                String receivedData = serialPort.readString(event.getEventValue());
                System.out.println(receivedData);
                if(receivedData == "Arduino Ready") JTAC.ready = true;

            } catch (SerialPortException ex) {
                System.out.println("Error in receiving string from COM-port: " + ex);
            }
        }
    }
}

Arduino:

String input;

void setup() {
  Serial.begin(9600);
  Serial.print("Arduino Ready");
}

void loop() {

}

Вот что выводит консоль:

      Ard
uino
 Rea
dy

Пробелы перед Ard не могут быть скопированы из вывода консоли.Есть ли способ, которым я мог бы сделать все это в одной строке?Возможно, мне понадобится снова получить данные от Arduino в будущем.Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Используйте начальные и конечные маркеры, такие как "#Arduino Ready $"

, где "#" обозначает начало, а "$" обозначает конец интересующей вас строки.затем вы можете использовать их для обработки полученных байтов и сохранения их на основе маркеров.

Проверьте это потрясающее руководство на форуме .

Я могу быть совершенно не прав скод [я полный нуб в Java], но я думаю, вы можете понять общую идею.

Метод последовательного события должен выглядеть следующим образом

if (event.isRXCHAR() && event.getEventValue() > 0) {
    try {
        char receivedData = serialPort.read(event.getEventValue());
        if (recvData) === '#' {
            this.readString = 1
        }else if(recvData === '$'){
            this.readString = 0
        }

        if(this.readString == 1){
            this.recvStringData.append(receivedData)
            System.out.println(this.recvStringData);
        }

        if(this.recvStringData == "Arduino Ready") JTAC.ready = true;

    } catch (SerialPortException ex) {
        System.out.println("Error in receiving string from COM-port: " + ex);
    }
}

И код Arduino будет

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

void loop(){
Serial.println("#Hi There$");
}
...