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

时间:2014-04-24 12:30:41

标签: 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;
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)

1 个答案:

答案 0 :(得分:0)

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