通过串口通信,java.net.SocketException:软件导致连接中止:套接字写入错误

通过串口通信,java.net.SocketException:软件导致连接中止:套接字写入错误,java,serial-port,communication,telnet,Java,Serial Port,Communication,Telnet,我已经编写了代码,帮助我的设备使用串行端口进行通信。但是在写了一些行之后,代码会发送异常。我不知道它为什么这样做 我编写的代码如下所示: import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.SocketException; import javax.comm.SerialPort; impo

我已经编写了代码,帮助我的设备使用串行端口进行通信。但是在写了一些行之后,代码会发送异常。我不知道它为什么这样做

我编写的代码如下所示:

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

输出是

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)

此错误源于网络层,而不是应用程序层。看起来底层TCP连接正在断开连接,可能是由于另一方意外关闭了它。检查另一端的日志。
tcpdump
(或Wireshark)数据包跟踪将验证TCP级别上发生的情况

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)