2017-01-31 1 views
0

Я работаю над проектом, где я получаю сенсорные данные на Arduino, который печатает его по серийному номеру на моем ноутбуке. Когда я использую Arduino IDE, это отлично работает с Serial Monitor. (Полные сообщения выглядят так: 1-35 251 58 152). Символы после - являются UID, поэтому они всегда должны быть такими же, как я только тестирую на одном устройстве.Пытается прочитать данные по последовательному со сканером, не читает полную строку

Когда я пытаюсь прочитать это через Java, я получаю разные сообщения (или, по крайней мере, не полные).

public void setupUSB() { 
    SerialPort ports[] = SerialPort.getCommPorts(); 
    for (SerialPort port : ports) { 
     if (port.getSystemPortName().equals("COM6")) myPort = port; // using LoRa over USB 
    } 
    myPort.setBaudRate(38400); 
    myPort.openPort(); 
    myPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0); 
} 

Метод выше инициирует порт USB, который я использую. После некоторых проверок я пытаюсь прочитать порт следующим образом (удаленный try catch и другой неважный код на этот вопрос).

Scanner data = new Scanner(myPort.getInputStream()).useDelimiter("\n"); 
if (data.hasNext()) { 
    String line = data.next(); 
    System.out.println("readUSB: " + line); 
} 

Я также попытался следующие:

Scanner data = new Scanner(myPort.getInputStream()); 
if (data.hasNextLine()) { 
    String line = data.nextLine(); 
    System.out.println("readUSB: " + line); 
} 

Результаты, которые я получаю от System.out.println("readUSB: " + line); являются следующие:

readUSB: � 
readUSB: 152 
readUSB: 9-35 251 58 152 
readUSB: 152 
readUSB: 1-35 251 58 152 
readUSB: 5 251 58�152 
readUSB: 251 58 152 
readUSB: 
readUSB: 58 152 

Как вы видите (есть некоторый шум в сообщениях), большинство из этих сообщений не завершены.

Может ли кто-нибудь сказать мне, что вызывает это и как его исправить?

[EDIT]

Как я использую LORA для передачи данных от одного датчика к другому Arduino, я сбор данных в виде символов. Оба порта Arduino и моего USB-устройства используют тот же baudRate по адресу 38400. Я чувствую, что ошибка может быть в коде ниже, так как когда я подключаю датчик USB (вместо отправки его через LoRa), значения действительно правильные.

if (packetFound) { 
    // Print the packet over Serial per character 
    Serial.println(); 
    for (int i=0; i<19; i++) { //20 and 21 are squares 
    Serial.print(char(RxData[i])); 
    RxData[i] = 0x00; // Clear buffer [0x20 -> space] 
    } 
} 
+0

Довольно тривиальный вопрос, но я должен спросить его, извините. Вы уверены, что бодраты соответствуют? P.S. Пожалуйста, добавьте код arduino –

+0

Используете ли вы подходящую кодировку? –

+0

Почему бы не использовать 'InputStream' для чтения данных из серийного номера? Два полезных ресурса, связанных с 'InputStream': 1. http://stackoverflow.com/questions/336714/reading-serial-port-in-java 2. http://www.java-samples.com/showtutorial.php? tutorialid = 11 –

ответ

0

Я не могу избавиться от этой проблемы, но я заметил следующее.

Если добавить строку в передней части сообщения в Arduino я получаю результаты, как это:

  • readUSB: ДСО World: 9-35 251 58 152 (Очевидно, он должен сказать Hello World).

Мое текущее решение моего вопроса добавляет набор из 10 символов # в начало моей строки в Arduino и их фильтрацию из строки позже.

while (line.charAt(0) == '#') { // Remove all the # chars in front of the real string 
    line = line.substring(1, line.length()); 
} 

Как было предложено в Комментарий: лучший способ, чтобы написать этот код:

int i = 0; 
while (line.charAt(i) == '#') { 
    i++; 
} 
line = line.substring(i); 

Я принимая этот ответ, как это работает для моей проблемы. НО, если у кого-то есть реальное (хорошее) решение этой проблемы, отправьте его, и я приму это.

+1

Это не эффективный способ обработки строк, так как 'substring()' будет создавать новый объект 'String' N раз, а старая строка будет выпущена в сборщик мусора. Лучше всего найти индекс первого non # в строке ('while (line.charAt (i) == '#') ++ i;'), а затем взять одну подстроку. Это не устранит вашу проблему, а просто общий комментарий к передовой практике обработки строк. –

Смежные вопросы