Чтение строки из 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());
}
}
Надеюсь, кто-то может помочь :)
@stanjg, 👍0
Обсуждение1 ответ
Лучший ответ:
Это распространенное заблуждение о том, как работает последовательная связь.
Вы "отправляете" "строка"; тест
. За исключением того, что это не так.
На самом деле вы помещаете строку test
в буфер отправки. Затем другая процедура по очереди берет каждый байт из этого буфера отправки и отправляет его через последовательный порт.
Затем Arduino получает этот байт и помещает его во внутренний приемный буфер.
Затем вы начинаете читать из серийного номера и просто получаете то, что находится в буфере приема в данный момент времени, сколько бы байтов это ни было.
Затем вы "отправляете" эти байты назад - за исключением того, что вы этого не сделаете. Вы помещаете эти байты во внутренний буфер передачи в Arduino, а другая процедура по очереди берет каждый байт из этого буфера передачи и отправляет его через последовательный порт.
Снова программа на Java начинает читать из последовательного порта, и все, что она получает, — это то, что в данный момент находится в приемном буфере, сколько бы байтов оно ни было в этот момент.
Нет такой вещи, как "строка" или "линия" в сериале. Все, что есть, это байты - один за другим.
Вы должны получать эти байты и преобразовывать их обратно в желаемую форму по мере поступления каждого байта.
В настоящее время у вас нет возможности узнать, какой должна быть эта форма, поскольку вы просто отправляете четыре байта без привязки к ним.
Обычно добавляют "терминатор" в строку при отправке, чтобы получатель знал, когда все байты прибыли. Для нас, людей, проще всего использовать "перевод строки". или символ \n
.
Ваша подпрограмма приема будет затем получать каждый символ по очереди, добавляя его к целевой строке до тех пор, пока не получит завершающий символ, после чего она узнает, что завершила получение этого фрагмента данных и может действовать с ним.
У меня есть популярный пост в блоге о чтении серийных номеров на Arduino здесь, и тот же принцип можно применить к любому другому языку.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Arduino Преобразование std:string в String
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Java NetBeans отправляет значение и получает значение от Arduino
- Arduino Serial.ReadString() проблема
вы должны сказать «за» при использовании раций. или сериал. В противном случае ответ «Да, это плохая идея» может быть истолкован как просто «да», если он обрывается., @dandavis