سؤال

لقد صنعت برنامج Java يعمل على جهاز كمبيوتر مع منفذي RS-232.

إنه يعمل بشكل جيد. قمت بتوصيل جهازين يتواصلان مع بعضهما البعض من خلال RS-232. أضع الكمبيوتر بين الكابل.

يمكنك أن ترى كل شيء يحصل على نافذة طرفية.

ولكن بعد فترة عشوائية من الوقت يتوقف جهاز واحد عن الاستجابة للاستعلامات.

عادةً ما يرسل الجهاز 1 الاستعلام 1 ويستجيب الجهاز.

ولكن بعد مرور بعض الوقت ، يبدأ الجهاز في إرسال الاستعلام 2 ولم يعد الجهاز 2 يستجيب بعد الآن.

هنا التقاط:

  • العمود الأول: معرف منفذ com
  • العمود الثاني: عرض عشري للشخصية
  • العمود الثالث: تصور الأحرف

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();
            }
        }
    }
هل كانت مفيدة؟

المحلول

لا يمكنني معرفة ماهية المشكلة ، لذلك سأجربها كابل مادي.

أو إذا كنت مفيدًا ، كابل مراقبة التجسس التسلسلي RS-232.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top