COM0COM RS232 Terminal Java Program
-
26-09-2019 - |
سؤال
لقد صنعت برنامج Java يعمل على جهاز كمبيوتر مع منفذي RS-232.
إنه يعمل بشكل جيد. قمت بتوصيل جهازين يتواصلان مع بعضهما البعض من خلال RS-232. أضع الكمبيوتر بين الكابل.
يمكنك أن ترى كل شيء يحصل على نافذة طرفية.
ولكن بعد فترة عشوائية من الوقت يتوقف جهاز واحد عن الاستجابة للاستعلامات.
عادةً ما يرسل الجهاز 1 الاستعلام 1 ويستجيب الجهاز.
ولكن بعد مرور بعض الوقت ، يبدأ الجهاز في إرسال الاستعلام 2 ولم يعد الجهاز 2 يستجيب بعد الآن.
هنا التقاط:
- العمود الأول: معرف منفذ com
- العمود الثاني: عرض عشري للشخصية
- العمود الثالث: تصور الأحرف
لماذا هذا لا يعمل؟ أخطط لجعل البرنامج الطرفي مفتوح المصدر في المستقبل.
تحرير: لم أنشر أي رمز لأن الرمز يعمل. إنه يتوقف فقط عن العمل بعد 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.