2016-06-23 4 views
0

Я пытаюсь прочитать последовательные данные для моего Java-приложения, которое я разрабатываю на Linux (Ubuntu 12.10). Это мой код:Невозможно прочитать последовательные данные с COM-порта в Java

try { 
    portId = CommPortIdentifier.getPortIdentifier("/dev/ttyS0"); 
    SimpleRead reader = new SimpleRead(); 
} catch (Exception e) { 
    TimeStamp=new Date().toString(); 
    System.out.println(TimeStamp+": ttyS0 "+portId); 
    System.out.println(TimeStamp+": msg1 - "+e); 
} 

SimpleRead конструктор и другой необходимый код:

public SimpleRead() { 
    try { 
     TimeStamp=new Date().toString(); 
     serialPort = (SerialPort) portId.open("SimpleRead", 2000); 
     System.out.println(TimeStamp + ": " + portId.getName() + " opened for scanner input"); 
    } catch (PortInUseException e) { 
     System.out.println(e); 
    } 
    try { 
     inputStream = serialPort.getInputStream(); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
    System.out.println("Input Stream set"); 
    try { 
     serialPort.addEventListener(this); 
    } catch (TooManyListenersException e) { 
     System.out.println(e); 
    } 
    System.out.println("Event listener added"); 
    serialPort.notifyOnDataAvailable(true); 
    try { 
     serialPort.setSerialPortParams(9600, 
       SerialPort.DATABITS_8, 
       SerialPort.STOPBITS_1, 
       SerialPort.PARITY_NONE); 
     serialPort.setDTR(false); 
     serialPort.setRTS(false); 
    } catch (UnsupportedCommOperationException e) { 
     System.out.println(e); 
    } 
    System.out.println("Parameters written"); 
    readThread = new Thread(this); 
    readThread.start(); 
} 

@Override 
public void run() { 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     System.out.println(e); 
    } 
} 

@Override 
public void serialEvent(SerialPortEvent event) { 
    switch(event.getEventType()) { 
     case SerialPortEvent.BI: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      System.out.println("Hello"); 
      break; 
     case SerialPortEvent.DATA_AVAILABLE: 
      byte[] readBuffer = new byte[20]; 
      System.out.println("Hello"); 
      try { 
       while (inputStream.available() > 0) { 
        int numBytes = inputStream.read(readBuffer); 
        if (numBytes>=16) 
         break; 
       } 
       //System.out.print(new String(readBuffer)); 
       TimeStamp = new java.util.Date().toString(); 
       System.out.println(TimeStamp + ": scanned input received:" + new String(readBuffer)); 
       inputStream.close(); 
      } catch (IOException e) { 
       System.out.println(e); 
      } 
      break; 
    } 
} 

По какой-то причине, не существует последовательных данные не считываются из порта, так как «Hello» в теле метод serialEvent() не выводится на экран вывода. Пожалуйста, помогите мне здесь!

EDIT Код взят из: http://www.java-samples.com/showtutorial.php?tutorialid=11 И да, устройство сконфигурировано для заданных параметров, прежде чем пытаться читать из него.

Новое редактирование Я использую Java Development 8 для платформы Linux x64 и API связи Java, взятый из http://www.java2s.com/Code/Jar/c/Downloadcomm20jar.htm. Моя IDE - NetBeans 8.1.

ответ

0

Получается, что я должен использовать 32-разрядную версию Java 1.8 для доступа к последовательным портам. Моя IDE в Linux не принимала 32-битные библиотеки на 64-битной машине, даже если она была вынуждена (путем изменения пути «jdk_home» в файле netbeans.conf), поэтому я столкнулся с проблемами доступа к последовательному порту.

Я переключил свою операционную систему на Windows 7, хотя я все еще на 64-битной системе, поскольку Netbeans IDE 8.1 в Windows может работать как в 64-битном, так и в 32-битном режимах с соответствующими исходными библиотеками. Поэтому я установил JDK 1.8 (32-разрядный) для Windows, а затем запустил свой код в среде IDE, обратившись к Javax.comm API on 64-bit Windows за то, что он работает. Теперь данные из последовательного порта считываются правильно.