代码之家  ›  专栏  ›  技术社区  ›  Berty

COM0COM RS232终端Java程序

  •  0
  • Berty  · 技术社区  · 14 年前
    我制作了一个Java程序,它运行在一个带有两个RS-232端口的计算机上。

    效果不错。我连接了两个通过RS-232相互通信的设备。我把电脑放在电缆之间。

    您可以在终端窗口上看到发送的所有内容。

    但在一段随机时间后,一个设备停止响应查询。

    通常情况下,设备1发送查询1,设备响应。

    但一段时间后,设备开始发送查询2,设备2不再响应。

    以下是一个捕获:

    • 第一列:COM端口ID
    • 第二列:字符的十进制表示法
    • 第三栏:人物形象化

    为什么这不起作用?我正在计划将来使终端程序开源。

    <编辑>: 我没有发布任何代码,因为代码有效。仅在5分钟-1小时后停止工作。

    这是连接代码:

    commportIdentifier portIdentifier;
    portIdentifier=commportIdentifier.getportIdentifier(“com1”);
    输入流输入1;
    输入流输入2;
    if(portIdentifier.isCurrentlyOwned()){
    addError(“Com1正在使用中!,请重新启动);
    }
    否则{
    serialport serialport=(serialport)portidentifier.open(“main”,2000);
    // 19200 8N1
    serialport.setserialportparams(19200,serialport.databits_8,serialport.stopbits_1,serialport.parity_none);
    //CTS/RTS握手
    serialport.setflowcontrolmode(serialport.flowcontrol_rtscts_in_serialport.flowcontrol_rtscts_out);
    //设置发送器
    com1sender.setWriterstream(serialport.getOutputstream());
    //集接收机
    //新建com1_receive(serialport.getinputstream()).start();
    
    incom1=serialport.getinputstream();
    
    portIdentifier=commportIdentifier.getportIdentifier(“com2”);
    if(portIdentifier.isCurrentlyOwned()){
    addError(“Com2正在使用中!,请重新启动);
    }
    否则{
    serialport=(serialport)portidentifier.open(“main2”,2001);
    // 19200 8N1
    serialport.setserialportparams(19200,serialport.databits_8,serialport.stopbits_1,serialport.parity_none);
    //CTS/RTS握手
    serialport.setflowcontrolmode(serialport.flowcontrol_rtscts_in_serialport.flowcontrol_rtscts_out);
    //设置发送器
    com2sender.setWriterstream(serialport.getOutputstream());
    //集接收机
    //new com2_receive(serialport.getinputstream()).start();
    
    incom2=serialport.getinputstream();
    新接收器(incom1,incom2).start();
    }
    }
    < /代码> 
    
    

    这是接收器:

    公共类接收器扩展线程{ 输入流输入1; 输入流输入2; 公共接收器(inputstream incom1,inputstream incom2){ this.incom1=incom1; 此.incom2=incom2; } @重写 public void run()。{ 尝试{ INT B1; INT B2; 当(真){ //如果流未绑定在.read()方法中,则返回-1 //DECT 同时((b1=incom1.read())!= -1){ //将槽发送到COM2 com2sender.send(新字节[](字节)b1); main.addText(integer.toString(b1),真); } /电视 同时((b2=incom2.read())!= -1){ //将槽发送到COM2 COM1SENDER.SEND(新字节[](字节)B2); main.addText(integer.toString(b2),false); 消息提取程序添加(b2); } //当流中断时等待10 ms,然后再次检查。 睡眠(10); } }捕获(异常E){ main.addError(e.getMessage()); } } } < /代码>

    这是发件人之一:

    公共类Com1Sender{ 静态输出流输出; 公共静态void setwriterstream(outputstream out){ com1sender.out=输出; } 公共静态void发送(byte[]bytes){ 尝试{ //通过串行端口发送只是写入输出流。 out.write(字节); 输出。 }捕获(IOException E){ e.printstacktrace(); } } 公共静态无效发送(int-letter){ 尝试{ main.addText(character.toString((char)letter),false); //通过串行端口发送只是写入输出流。 out.write(新字节[](字节)字母); 输出。 }捕获(IOException E){ e.printstacktrace(); } } } < /代码> <把电脑放在电缆之间。

    你可以在终端窗口看到所有发送的信息。

    但是在一段随机时间后,一个设备停止响应查询。

    通常,设备1发送查询1,设备响应。

    但一段时间后,设备开始发送查询2,设备2不再响应。

    以下是一个捕获:

    • 第一列:COM端口ID
    • 第二列:字符的十进制表示法
    • 第三栏:人物形象化

    https://i77.photobucket.com/albums/j74/bertyhell/errors/capture.png?t=1281084570

    为什么这不起作用?我正在计划将来使终端程序开源。

    编辑: 我没有发布任何代码,因为代码有效。它只在5分钟-1小时后停止工作。

    这是连接代码:

        CommPortIdentifier portIdentifier;
        portIdentifier = CommPortIdentifier.getPortIdentifier("COM1");
        InputStream inCom1;
        InputStream inCom2;
        if (portIdentifier.isCurrentlyOwned()) {
            addError("COM1 in use!, please restart");
        }
        else {
            SerialPort serialPort = (SerialPort) portIdentifier.open("Main", 2000);
            //19200 8n1
            serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            // CTS/RTS handshaking
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
            //Set sender
            Com1Sender.setWriterStream(serialPort.getOutputStream());
            //Set receiver
            //    new com1_receive(serialPort.getInputStream()).start();
    
            inCom1 = serialPort.getInputStream();
    
            portIdentifier = CommPortIdentifier.getPortIdentifier("COM2");
            if (portIdentifier.isCurrentlyOwned()) {
                addError("COM2 in use!, please restart");
            }
            else {
                serialPort = (SerialPort) portIdentifier.open("Main2", 2001);
                //19200 8n1
                serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                // CTS/RTS handshaking
                serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
                //Set sender
                Com2Sender.setWriterStream(serialPort.getOutputStream());
                //set receiver
                //    new com2_receive(serialPort.getInputStream()).start();
    
                inCom2 = serialPort.getInputStream();
                new Receiver(inCom1, inCom2).start();
            }
        }
    

    这是接收器:

        public class Receiver extends Thread {
            InputStream inCom1;
            InputStream inCom2;
    
            public Receiver(InputStream inCom1, InputStream inCom2) {
                this.inCom1 = inCom1;
                this.inCom2 = inCom2;
            }
    
            @Override
            public void run() {
                try {
                    int b1;
                    int b2;
                    while (true) {
                        // if stream is not bound in.read() method returns -1
    
                        //dect
                        while ((b1 = inCom1.read()) != -1) {
                            //Send trough to COM2
                            Com2Sender.send(new byte[]{(byte) b1});
                            Main.addText(Integer.toString(b1), true);
                        }
    
                        //televic
                        while ((b2 = inCom2.read()) != -1) {
                            //Send trough to COM2
                            Com1Sender.send(new byte[]{(byte) b2});
                            Main.addText(Integer.toString(b2), false);
                            MessageExtractor.add(b2);
                        }
    
                        // Wait 10 ms when stream is broken and check again.
                        sleep(10);
                    }
                } catch (Exception e) {
                    Main.addError(e.getMessage());
                }
            }
        }
    

    这是发件人之一:

        public class Com1Sender {
            static OutputStream out;
    
            public static void setWriterStream(OutputStream out) {
                Com1Sender.out = out;
            }
    
            public static void send(byte[] bytes) {
                try {
                    // Sending through serial port is simply writing into OutputStream.
                    out.write(bytes);
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            public static void send(int letter) {
                try {
                    Main.addText(Character.toString((char)letter), false);
    
                    // Sending through serial port is simply writing into OutputStream.
                    out.write(new byte[]{(byte)letter});
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   Peter Mortensen Mohit    13 年前

    我不知道是什么问题,所以我要试试看 a physical cable .

    或者如果你方便, a RS-232 serial spy monitor cable .

    推荐文章