2014-04-24 2 views
0

직렬 포트를 사용하여 장치가 통신하는 데 도움이되는 코드를 작성했습니다. 그러나 코드를 작성한 후에 코드는 예외를 보냅니다. 그리고 왜이 일을하는지 모르겠습니다.시리얼 포트를 통한 통신, java.net.SocketException : 소프트웨어로 인해 연결이 끊어짐 : 소켓 쓰기 오류가 발생했습니다.

내가 작성한 코드는 아래에로이다 :

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.InetAddress; 
import java.net.SocketException; 
import javax.comm.SerialPort; 
import javax.comm.UnsupportedCommOperationException; 
import org.dellroad.jvser.TelnetSerialPort; 
import org.apache.commons.net.telnet.TelnetClient; 
public class InclinometerCommunicator 
{ 

private static final int DEFAULT_TCP_PORT = 10001; 

private static final byte ADDRESS = (byte) 0xB1; 
private static final byte ENQUIRY = 5; 

private static final int PACKET_LENGTH = 11; 

private TelnetSerialPort port; 
public static final int BAUD_RATE = 9600; 
public static final int DATA_BITS = SerialPort.DATABITS_8; 
public static final int PARITY_BITS = SerialPort.PARITY_NONE; 
public static final int STOP_BITS = SerialPort.STOPBITS_1; 
public static final int FLOW_CONTROL = SerialPort.FLOWCONTROL_NONE; 

public InclinometerCommunicator(InetAddress host) throws UnsupportedCommOperationException, SocketException, IOException { 
    this(host, DEFAULT_TCP_PORT); 
} 

public InclinometerCommunicator(InetAddress host, int tcpPort) throws UnsupportedCommOperationException, SocketException, IOException { 
    port = new TelnetSerialPort(); 
    port.setSerialPortParams(BAUD_RATE, DATA_BITS, STOP_BITS, PARITY_BITS); 
    port.setFlowControlMode(FLOW_CONTROL); 
    port.setDTR(true); 
    port.setRTS(false); 
    port.getTelnetClient().connect(host, tcpPort); 


} 

public float getAngle() throws IOException, InterruptedException 
    { 
    sendFlowControl(); 
    Thread.sleep(100); 
    sendEnquiry(); 
    Thread.sleep(200); 
    receiveFlowControl(); 
    Thread.sleep(200); 
    byte[] packet = readPacket(); 

    return parsePacket(packet); 
    //return (float)1.5; 
} 

private void sendFlowControl() { 
    port.setDTR(false); 
    port.setRTS(true); 
} 

private void sendEnquiry() throws IOException { 
    OutputStream out = port.getOutputStream(); 
    out.write(new byte[]{ADDRESS, ENQUIRY}); 
    out.flush(); 

} 

private void receiveFlowControl() { 
    port.setRTS(false); 
    port.setDTR(true); 
} 

private byte[] readPacket() throws IOException { 
    InputStream in = port.getInputStream(); 
    byte[] buf = new byte[PACKET_LENGTH]; 
    int totalRead = 0; 
    int i = 0; 

    while (totalRead < PACKET_LENGTH && i < 100) { 
     totalRead += in.read(buf, totalRead, PACKET_LENGTH - totalRead); 

     i++; 
    } 
    return buf; 
} 

private float parsePacket(byte[] packet) { 
    //TODO add additional checking 
    /* 
    for(byte b: packet) 
     System.out.print(b+" "); 
    System.out.print("\n"); 
    */ 
    return (float) ((100*atoi(packet[1])) + (10*atoi(packet[2])) + atoi(packet[3]) + (.1*atoi(packet[5])) + (.01*atoi(packet[6]))); 
} 

private int atoi(byte a) { 
    return (byte) (a - '0'); 
} 
} 

그리고 다른 클래스는 여기에 있습니다 :

import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.InetAddress; 
import java.net.Socket; 

public class QService { 

private InclinometerCommunicator communicator; 


public static void main(String[] args) { 
    QService rc = new QService(); 
    rc.run("10.168.217.106"); 
} 

public void run(String ip) 
{ 

    try 
    { 

     communicator = new InclinometerCommunicator(InetAddress.getByName(ip), 9999); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    while (true) 
    { 
      float angle ; 

     try 
     { 


      angle = communicator.getAngle(); 
      System.out.println("Angle:" + angle); 
      Thread.sleep(1000); 


     } 
     catch (Exception e) 
     { 
      System.out.println("Exception"+"::"+e); // Exception coming here 
      e.printStackTrace(); 
     } 

    } 
} 

}

그리고 출력은

Angle:-670.48 
Angle:7118.36 
Angle:367.57 
Angle:7351.34 
Angle:3094.42 
Angle:-1599.83 
Angle:527.55 
Angle:7119.96 
Angle:3857.8 
Angle:209.53 
Exception::java.net.SocketException: Software caused connection abort: socket write error 
java.net.SocketException: Software caused connection abort: socket write error 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(Unknown Source) 
at java.net.SocketOutputStream.write(Unknown Source) 
at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
at java.io.BufferedOutputStream.flush(Unknown Source) 
at org.dellroad.jvser.telnet.TelnetClient._flushOutputStream(TelnetClient.java:81) 
at org.dellroad.jvser.telnet.TelnetOutputStream.flush(TelnetOutputStream.java:146) 
at InclinometerCommunicator.sendEnquiry(InclinometerCommunicator.java:66) 
at InclinometerCommunicator.getAngle(InclinometerCommunicator.java:48) 
at QService.run(QService.java:38) 
at QService.main(QService.java:14) 

답변

0

입니다 이 오류는 응용 프로그램 계층이 아니라 네트워크 계층입니다. 기본 TCP 연결이 끊어지는 것처럼 보입니다. 예를 들어 다른 쪽이 예기치 않게 닫히기 때문일 수 있습니다. 다른 쪽 끝에있는 로그를 확인하십시오. tcpdump (또는 Wireshark) 패킷 추적은 TCP 수준에서 진행중인 작업을 확인합니다.

관련 문제