我制作了一个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
- 第二列:字符的十进制表示法
- 第三栏:人物形象化
为什么这不起作用?我正在计划将来使终端程序开源。
编辑:
我没有发布任何代码,因为代码有效。它只在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();
}
}
}