有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java合并串行端口的XBee api片段

我试图将Xbee(802.15.4)在API模式下通过RS-232串行端口接收到的数据包片段合并在一起。我使用readBytes方法从jssc java库中获取片段

这是我的接待代码

    private static class PortReader implements SerialPortEventListener {

    @Override
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR() && event.getEventValue() > 0) {
            try {
                byte[] receivedData = serialPort.readBytes(event.getEventValue());
                if(Utils.isConfirmPacket(Utils.toHex(receivedData))){
                    System.out.println("XBee confim that msg is sent!");
                }else{
                    System.out.println("Received response from port: " + Utils.toHex(receivedData));
                    int dataLength = Utils.toHex(receivedData).length();
                    receiveFile("testRx", receivedData, dataLength);
                }

            }
            catch (SerialPortException ex) {
                System.out.println("Error in receiving response from port: " + ex);
            }
        }
    }

我的receiveFile()方法需要在一个片段中包含完整的数据包。以下是我在控制台中得到的信息:

Received response from port: 7e003c8100013200
Received response from port: 2000123200ff1200
Received response from port: 0001000500000000
Received response from port: 0000000020000000
Received response from port: 1251000012455222
Received response from port: 446174613a206365
Received response from port: 6369206573742075
Received response from port: 6e20746573743b90

由于我使用的是API模式,所以无法像在其他解决方案(Read Complete Line Java Serial Port)中看到的那样,向指定的数据包结尾发送结束分隔符

我本想使用下一个数据包的开始分隔符,但没有成功


共 (1) 个答案

  1. # 1 楼答案

    我用api数据包的长度计算出来了。由于长度位于第一个数组的[1]和[2]位置,因此在接收数据时,我可以使用该值继续构建数据包。当我的msgLengthLeft值为0时,我知道数据包已经全部收到,我可以返回完整的数据包。这是我的代码:

    private static class PortReader implements SerialPortEventListener {
        private short msgLength;
        private short msgLengthLeft;
        private byte[] receivedMsg = new byte[packetSize];
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
    
        @Override
        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR() && event.getEventValue() > 0) {
                try {
                    byte[] receivedData = serialPort.readBytes(event.getEventValue());
                    if(Utils.isConfirmPacket(Utils.toHex(receivedData))){
                        System.out.println("XBee confim that msg is sent!");
                    }else{
                        if(receivedData[0] == 0x7e){    //0x7e is the start delimiter of a frame
                            ByteBuffer wrapped = ByteBuffer.wrap(receivedData,1,2); // big-endian by default
                            msgLength = (short) (wrapped.getShort()+4); //Need to add 4 to the value becaus some field are not include in the length field of the api packet
                            msgLengthLeft = (short) (msgLength - receivedData.length);
                            outputStream.write(receivedData);  
                            return;
                        }else{
                            msgLengthLeft = (short) (msgLengthLeft - receivedData.length);
                            outputStream.write(receivedData); 
                            if(msgLengthLeft != 0){
                                return;
                            }
                        }
                        System.out.println("Received response from port: " + Utils.toHex(outputStream.toByteArray( )));
                        int dataLength = Utils.toHex(receivedMsg).length();
                        //receiveFile("testRx", receivedData, dataLength);
                    }
    
                }
                catch (SerialPortException | IOException ex) {
                    System.out.println("Error in receiving response from port: " + ex);
                }
            }
        }
    }