2016-06-23 5 views
0

Linux (Ubuntu 12.10)에서 개발중인 Java 응용 프로그램의 직렬 데이터를 읽으려고합니다. 의 본문에 "안녕하세요"때문에, 어떤 시리얼 데이터 포트에서 읽을되고있다 어떤 이유Java의 COM 포트에서 직렬 데이터를 읽을 수 없습니다.

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; 
    } 
} 

:

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 생성자 및 기타 필요한 코드 : 이것은 내 코드입니다 serialEvent() 메서드는 출력 화면에 인쇄되지 않습니다. 제발 도와주세요! 그것에서 읽기 전에 http://www.java-samples.com/showtutorial.php?tutorialid=11 그리고 네, 장치가 지정된 파라미터에 대해 구성된 :

편집 코드에서 가져옵니다.

새 편집 Linux x64 플랫폼 용 Java SE 8 Development Kit 및 http://www.java2s.com/Code/Jar/c/Downloadcomm20jar.htm에서 가져온 Java Communications API를 사용하고 있습니다. 내 IDE는 Netbeans 8.1입니다.

답변

0

그래서 직렬 포트에 액세스하기 위해 Java 1.8의 32 비트 버전을 사용해야한다는 것이 밝혀졌습니다. Linux의 내 IDE는 강제로 (심지어는 "jdk_home"경로를 netbeans.conf 파일로 변경하여) 64 비트 컴퓨터에서 32 비트 라이브러리를 허용하지 않으므로 직렬 포트에 액세스하는 데 문제가있었습니다.

Windows에서 Netbeans IDE 8.1이 각각의 소스 라이브러리에서 64 비트 및 32 비트 모드로 실행될 수 있기 때문에 여전히 64 비트 시스템이지만 Windows 7로 내 운영 체제를 전환했습니다. Windows 용 JDK 1.8 (32 비트)를 설치 한 다음 IDE에 코드를 실행했습니다.이 코드를 사용하려면 Javax.comm API on 64-bit Windows을 참조하십시오. 이제 직렬 포트의 데이터를 올바르게 읽습니다.