2013-04-26 8 views
3

Я использую BufferedReader для чтения данных с USB-шлюза, который периодически получает сетевые кадры ZigBee с устройства Arduino.BufferedReader пропускает случайные символы при чтении с USB

Это то, что кадр должен выглядеть следующим образом:

~f�}3�@v<-,R#}3�@v<--mac:0013A20040763C2D -H:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

Но вместо этого, это всегда не хватает некоторых символов ближе к концу адреса MAC, например, так:

~f�}3�@v<-,R#}3�@v<--mac:0013A2004076D -H:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

Или

~f�}3�@v<-,R#}3�@v<--mac:0013A2004076C2:-25.80 -T:22.58 -L:2.6451 -N:100.00 -D:0.0290 -B:35 

Мусор в начале представляет собой информацию о сетевом заголовке низкого уровня, я думаю.

я на Ubuntu, и кадры показывают, прекрасно при чтении из терминала, используя

cat /dev/ttyUSB0 

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

public void run() { 
    Boolean keepRunning = true; 
    BufferedReader br = new BufferedReader(new InputStreamReader(portReader.getInputStream())); 
    String line; 

    while (keepRunning) { 
     try { 
      while ((line = br.readLine()) != null) { 
       handleData(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Я использую RXTXcomm.jar, доступный здесь http://rxtx.qbang.org/wiki/index.php/Main_Page

Это где я открыть порт.

while (!connected && !timedOut) { 
       System.out.print("\n\nConnecting to " + portName); 
       //Open Ports 
       CommPort commPort = portIdentifier.open(this.getClass() 
         .getName(), 9600); 

       //TODO Should we rule out other kinds? 
       if (commPort instanceof SerialPort) { 

        //Pass the open port 
        SerialPort serialPort = (SerialPort) commPort; 
        serialPort.enableReceiveTimeout(15000); 

        //Configure the port communication interface 
        serialPort.setSerialPortParams(bauds, 
          SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
          SerialPort.PARITY_NONE); 

        //Open a stream and read from the port 
        inputStream = serialPort.getInputStream(); 
        int portBuffer = inputStream.read(); 

        //Check if there is something in the buffer, which 
        //means that a connection was established 
        if (portBuffer > -1) { 
         connected = true;       
        } else { 
         System.err.println("Connection to " + portName 
           + " timed out"); 
         serialPort.close(); 
         inputStream.close(); 
         timedOut = true; 
        } 
       } else { 
        System.err 
          .println("Error: Only serial ports are handled by this application."); 
       } 
      } 

Любые идеи о том, что может произойти неправильно?

+0

Всегда ли это два конкретных выхода или он отличается? – Zyerah

+0

Он изменяется, по-видимому, случайным образом. Тем не менее, это всегда некоторые персонажи в одной позиции. – broncoAbierto

+0

Это интересно. Не такое поведение, которое я ожидал бы от последовательного соединения. Попробуйте распечатать строки как массивы в двоичном формате? Мне любопытно, есть ли какие-то шаблоны. (Кроме того, вам, возможно, придется использовать @Telthien, чтобы уведомить меня, не знаю, почему, но стандартное уведомление не запускалось) – Zyerah

ответ

1

хорошо, я не уверен, что это была проблема, но вы не должны кошки на устройстве с последовательным портом, так как он не будет правильно настроить последовательное устройство (с правильной скоростью чтения, четностью и т. Д. и небуферизованный). Всегда используйте вместо этого screen /dev/ttyUSB0 SPEED, или python -m serial.tools.miniterm или minicom.

Мусор, о котором вы говорите, вы распечатываете, действительно, данные кадра. Вы можете найти в руководствах XBee, как он построен (символ ~, обозначающий начало нового кадра в режиме API, за которым следуют тип фрейма, длина, содержание и CRC). Учитывая CRC, вы можете проверить правильность чтения кадра, если нет отсутствующих бит.

Я написал XBee дейтаграмм парсер C++:

и участвовал в одном в C:

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

И, наконец, я действительно часто сталкивался с проблемами между XBee и доской (делая все входящие дейтаграммы ошибочными и т. Д.). Вы можете захотеть задействовать цикл и/или поменять ключ xbee каждый раз, когда данные становятся неправильными (отсюда необходимость проверки входящих дейтаграмм).

+0

Спасибо, хотя проблема возникла при чтении с помощью Java API, а не при извлечении данных с помощью команды cat. Однако я дам этим синтаксическим анализаторам. – broncoAbierto

+0

ну, я просто говорю, что могут быть побочные эффекты, используя 'cat' прямо на порт без правильной настройки устройства для * дальнейших * чтений, хотя я нахожу странным, что у вас не возникают проблемы с помощью cat on серийный чардев напрямую. Но я не говорю, что это вызывает проблемы. Вы должны тщательно проверить датаграммы XBee, когда они приходят, и проверить их CRC! – zmo

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