Чтение строки из serial дает нулевые строки с JSSC

Мне нужно отправить последовательные данные на Arduino UNO из Java-приложения. Для этого я использую JSSC.

Я хотел убедиться, что мои данные действительно правильно поступают в Arduino, прежде чем переходить к следующему шагу моего приложения. Для этого я попытался просто вернуть строку, которую я отправляю, однако, когда я отправляю "test", возвращается вот что:

t
null
est

Мне интересно, является ли это проблемой на стороне Java с отправкой/чтением строки или это проблема с отправкой/чтением на Arduino, и как я могу это исправить.

Это мой Java-код для чтения данных:

try {
    port.addEventListener(event -> {
        try {
            System.out.println(port.readString());
        } catch (SerialPortException e) {
            e.printStackTrace();
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}

Это мой код Java для отправки данных:

try {
    port.writeString("test");
} catch (SerialPortException e) {
    e.printStackTrace();
}

А это код на моей Arduino:

void loop() {
  while (Serial.available() > 0) {
    Serial.print(Serial.readString());
  }
}

Надеюсь, кто-то может помочь :)

, 👍0

Обсуждение

вы должны сказать «за» при использовании раций. или сериал. В противном случае ответ «Да, это плохая идея» может быть истолкован как просто «да», если он обрывается., @dandavis


1 ответ


Лучший ответ:

0

Это распространенное заблуждение о том, как работает последовательная связь.

Вы "отправляете" "строка"; тест. За исключением того, что это не так.

На самом деле вы помещаете строку test в буфер отправки. Затем другая процедура по очереди берет каждый байт из этого буфера отправки и отправляет его через последовательный порт.

Затем Arduino получает этот байт и помещает его во внутренний приемный буфер.

Затем вы начинаете читать из серийного номера и просто получаете то, что находится в буфере приема в данный момент времени, сколько бы байтов это ни было.

Затем вы "отправляете" эти байты назад - за исключением того, что вы этого не сделаете. Вы помещаете эти байты во внутренний буфер передачи в Arduino, а другая процедура по очереди берет каждый байт из этого буфера передачи и отправляет его через последовательный порт.

Снова программа на Java начинает читать из последовательного порта, и все, что она получает, — это то, что в данный момент находится в приемном буфере, сколько бы байтов оно ни было в этот момент.

Нет такой вещи, как "строка" или "линия" в сериале. Все, что есть, это байты - один за другим.

Вы должны получать эти байты и преобразовывать их обратно в желаемую форму по мере поступления каждого байта.

В настоящее время у вас нет возможности узнать, какой должна быть эта форма, поскольку вы просто отправляете четыре байта без привязки к ним.

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

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

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

,