首页 新闻 赞助 找找看

JAVA,串口,485信号,RXTX相关问题

0
悬赏园豆:10 [待解决问题]

这是在RXTX官网COPY的代码,

复制代码
package rxtx;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm {
    public TwoWaySerialComm() {
        super();
    }

    void connect(String portName) throws Exception {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if (portIdentifier.isCurrentlyOwned()) {
            System.out.println("Error: Port is currently in use");
        } else {
            //打开接口
            CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
            
            if (commPort instanceof SerialPort) {
                SerialPort serialPort = (SerialPort) commPort;
                //设置串口通行控制:波特率=9600,数据位=8,停止位=1,无效验
                serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE);
                //输入
                InputStream in = serialPort.getInputStream();
                //输出
                OutputStream out = serialPort.getOutputStream();
                
                System.out.println("111");
                (new Thread(new SerialReader(in))).start();
                (new Thread(new SerialWriter(out))).start();
                System.out.println("222");

            } else {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    /** 读取*/
    public static class SerialReader implements Runnable {
        InputStream in;

        public SerialReader(InputStream in) {
            this.in = in;
        }

        public void run() {
            byte[] buffer = new byte[1024];
            int len = -1;
            try {
                while ((len = this.in.read(buffer)) > -1) {
                    System.out.print(new String(buffer, 0, len));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /** 写出*/
    public static class SerialWriter implements Runnable {
        OutputStream out;

        public SerialWriter(OutputStream out) {
            this.out = out;
        }

        public void run() {
            try {
                int c = 0;
                while ((c = System.in.read()) > -1) {
                    this.out.write(c);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            (new TwoWaySerialComm()).connect("COM3");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
复制代码

之后运行,无论怎么输入,输入什么,都只能串口发送数据,并不能接收数据,
发送出去的口令,永远没有回应。

应该是代码SerialWriter方法有点问题,希望懂的大神指点一二。感激不尽

用串口设备官网给得软件,是可以串口输入输出数据的,说明串口链接说明的都ok

ssrS丶的主页 ssrS丶 | 初学一级 | 园豆:37
提问于:2016-12-12 10:31
< >
分享
所有回答(1)
0

你为什么不认为是硬件问题 —— ;你应当先用个工具测试一下,确认一下硬件及线路没问题;

花飘水流兮 | 园豆:13560 (专家六级) | 2016-12-12 10:47

硬件没问题,我拿产品官网的测试工具使用过了的,使用一切正常,

支持(0) 反对(0) ssrS丶 | 园豆:37 (初学一级) | 2016-12-12 10:51

产品就是截图上的KD51B10这个产品,是个温湿度传感器

支持(0) 反对(0) ssrS丶 | 园豆:37 (初学一级) | 2016-12-12 10:51

串口本身很简单,这是Modbus协议,你是否发送的是该协议包——你乱发数据是不会甩你的。也真是醉了——你们哪位领导让你从串口去做Modbus的协议的,这个有专门的协议解析模块的,自己去查下载。别个这个包往往包含了其他通讯链路以及叫RTU(好像叫这个来着)模式的。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2016-12-12 13:58

@花飘水流兮:我的问题说了啊,我写的代码使用RXTX协议,并不是Modbus协议。该产品官网下载下来的工具是modbus协议实现数据发送和读取的,工具运行成功,说明串口的驱动,连接都是对的,如果RXTX协议的代码写好的话,按道理应该也是能发送和读取数据的,可我现在只能发送,不能读取,发送的数据时按照说明文档的,不应该没有回复的。

支持(0) 反对(0) ssrS丶 | 园豆:37 (初学一级) | 2016-12-12 15:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册