以前没弄过串口通信,现在业务需要,就弄了个modBusScan虚拟了一个modBus设备,连上以后,再copy了网上一段代码,开始报类找不到,就下了个rxtx-2.2pre2-bins.zip,把里面的包和dll文件都弄到了jre里面,初始化就成功了,但是读写又遇到这个问题,弄了个近1天,还是没弄出来,网上的方法也基本都试过了,实在是不知所以然。
代码如下。
@Test
public void test1(){
int SLAVE_ADDRESS=1;
int rate=57600;
SerialParameters serialParameters=new SerialParameters();
//设定MODBUS通讯的串行口
serialParameters.setCommPortId("COM1");
//设定成无奇偶校验
serialParameters.setParity(0);
//设定成数据位是10位
serialParameters.setDataBits(8);
//设定为1个停止位
serialParameters.setStopBits(1);
//串行口上的波特率
serialParameters.setBaudRate(rate);
ModbusFactory modbusFactory = new ModbusFactory();
ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
try {
master.init();
readDiscreteInputTest(master,SLAVE_ADDRESS,0,8);
//writeRegistersTest(master,SLAVE_ADDRESS, 0, new short[]{0x0,0x1,0x1,0x0,0x1,0x0, 0x1, 0x0, 0x1,0x0} );
// readHoldingRegistersTest(master,SLAVE_ADDRESS,0,8);
} catch (ModbusInitException e) {
System.out.println( "Modbus Master Init Error: " + e.getMessage());
e.printStackTrace();
}
finally {
master.destroy();
}
}
/**
* 读开关量型的输入信号
* @param master 主站
* @param slaveId 从站地址
* @param start 起始偏移量
* @param len 待读的开关量的个数
*/
private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {
try {
ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);
ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
if (response.isException())
System.out.println("Exception response: message=" + response.getExceptionMessage());
else
System.out.println(Arrays.toString(response.getBooleanData()));
}
catch (ModbusTransportException e) {
e.printStackTrace();
}
}后来又换了一个rxtx直接连串口的测试代码,还是不行,主要是一连modbusScan,就代码报unkwon application,把modbusScan断开,就报timeout
代码如下。
@Test
public void test1(){
int SLAVE_ADDRESS=1;
int rate=57600;
SerialParameters serialParameters=new SerialParameters();
//设定MODBUS通讯的串行口
serialParameters.setCommPortId("COM1");
//设定成无奇偶校验
serialParameters.setParity(0);
//设定成数据位是10位
serialParameters.setDataBits(8);
//设定为1个停止位
serialParameters.setStopBits(1);
//串行口上的波特率
serialParameters.setBaudRate(rate);
ModbusFactory modbusFactory = new ModbusFactory();
ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
try {
master.init();
readDiscreteInputTest(master,SLAVE_ADDRESS,0,8);
//writeRegistersTest(master,SLAVE_ADDRESS, 0, new short[]{0x0,0x1,0x1,0x0,0x1,0x0, 0x1, 0x0, 0x1,0x0} );
// readHoldingRegistersTest(master,SLAVE_ADDRESS,0,8);
} catch (ModbusInitException e) {
System.out.println( "Modbus Master Init Error: " + e.getMessage());
e.printStackTrace();
}
finally {
master.destroy();
}
}
/**
* 读开关量型的输入信号
* @param master 主站
* @param slaveId 从站地址
* @param start 起始偏移量
* @param len 待读的开关量的个数
*/
private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {
try {
ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);
ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
if (response.isException())
System.out.println("Exception response: message=" + response.getExceptionMessage());
else
System.out.println(Arrays.toString(response.getBooleanData()));
}
catch (ModbusTransportException e) {
e.printStackTrace();
}
}后来又换了一个rxtx直接连串口的测试代码,还是不行,主要是一连modbusScan,就代码报unkwon application,把modbusScan断开,就报timeout
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货