/*throws TimeoutException, XBeeException */
        /**
         * Sends the provided data to the XBee device of the network corresponding
         * to the given 64-bit/16-bit address.
         *
         * <p>This method blocks till a success or error response arrives or the
         * configured receive timeout expires.</p>
         *
         * <p>The received timeout is configured using the {@code setReceiveTimeout}
         * method and can be consulted with {@code getReceiveTimeout} method.</p>
         *
         * <p>For non-blocking operations use the method
         * {@link #sendDataAsync(XBee64BitAddress, XBee16BitAddress, byte[])}.</p>
         *
         * @param address64Bit The 64-bit address of the XBee that will receive the
         *                     data.
         * @param address16bit The 16-bit address of the XBee that will receive the
         *                     data. If it is unknown the
         *                     {@code XBee16BitAddress.UNKNOWN_ADDRESS} must be
         *                     used.
         * @param data Byte array containing the data to be sent.
         *
         * @throws InterfaceNotOpenException if this device connection is not open.
         * @throws ArgumentNullException if {@code address64Bit == null} or
         *                              if {@code address16bit == null} or
         *                              if {@code data == null}.
         * @throws TimeoutException if there is a timeout sending the data.
         * @throws XBeeException if a remote device is trying to send data or
         *                       if there is any other XBee related exception.
         *
         * @see #getReceiveTimeout()
         * @see #setReceiveTimeout(int)
         * @see #sendData(RemoteXBeeDevice, byte[])
         * @see #sendData(XBee64BitAddress, byte[])
         * @see #sendDataAsync(RemoteXBeeDevice, byte[])
         * @see #sendDataAsync(XBee64BitAddress, byte[])
         * @see #sendDataAsync(XBee64BitAddress, XBee16BitAddress, byte[])
         * @see com.digi.xbee.api.models.XBee16BitAddress
         * @see com.digi.xbee.api.models.XBee64BitAddress
         */
        protected void SendData(XBee64BitAddress address64Bit, XBee16BitAddress address16bit, byte[] data)
        {
            // Verify the parameters are not null, if they are null, throw an exception.
            if (address64Bit == null)
                throw new ArgumentNullException("64-bit address cannot be null");
            if (address16bit == null)
                throw new ArgumentNullException("16-bit address cannot be null");
            if (data == null)
                throw new ArgumentNullException("Data cannot be null");

            // Check connection.
            if (!connectionInterface.SerialPort.IsOpen)
                throw new InterfaceNotOpenException();
            // Check if device is remote.
            if (IsRemote)
                throw new OperationNotSupportedException("Cannot send data to a remote device from a remote device.");

            logger.DebugFormat(ToString() + "Sending data to {0}[{1}] >> {2}.",
                    address64Bit, address16bit, HexUtils.PrettyHexString(data));

            XBeePacket xbeePacket = new TransmitPacket(GetNextFrameID(), address64Bit, address16bit, 0, (byte)XBeeTransmitOptions.NONE, data);
            SendAndCheckXBeePacket(xbeePacket, false);
        }
        /*throws TimeoutException, XBeeException */
        /**
         * Sends the provided data to the XBee device of the network corresponding
         * to the given 64-bit address.
         *
         * <p>This method blocks till a success or error response arrives or the
         * configured receive timeout expires.</p>
         *
         * <p>The received timeout is configured using the {@code setReceiveTimeout}
         * method and can be consulted with {@code getReceiveTimeout} method.</p>
         *
         * <p>For non-blocking operations use the method
         * {@link #sendData(XBee64BitAddress, byte[])}.</p>
         *
         * @param address The 64-bit address of the XBee that will receive the data.
         * @param data Byte array containing the data to be sent.
         *
         * @throws InterfaceNotOpenException if this device connection is not open.
         * @throws ArgumentNullException if {@code address == null} or
         *                              if {@code data == null}.
         * @throws TimeoutException if there is a timeout sending the data.
         * @throws XBeeException if there is any other XBee related exception.
         *
         * @see #getReceiveTimeout()
         * @see #setReceiveTimeout(int)
         * @see #sendData(RemoteXBeeDevice, byte[])
         * @see #sendData(XBee64BitAddress, XBee16BitAddress, byte[])
         * @see #sendDataAsync(RemoteXBeeDevice, byte[])
         * @see #sendDataAsync(XBee64BitAddress, byte[])
         * @see #sendDataAsync(XBee64BitAddress, XBee16BitAddress, byte[])
         * @see com.digi.xbee.api.models.XBee64BitAddress
         */
        protected void SendData(XBee64BitAddress address, byte[] data)
        {
            // Verify the parameters are not null, if they are null, throw an exception.
            if (address == null)
                throw new ArgumentNullException("Address cannot be null");
            if (data == null)
                throw new ArgumentNullException("Data cannot be null");

            // Check connection.
            if (!connectionInterface.SerialPort.IsOpen)
                throw new InterfaceNotOpenException();
            // Check if device is remote.
            if (IsRemote)
                throw new OperationNotSupportedException("Cannot send data to a remote device from a remote device.");

            logger.DebugFormat(ToString() + "Sending data to {0} >> {1}.", address, HexUtils.PrettyHexString(data));

            XBeePacket xbeePacket;
            switch (XBeeProtocol)
            {
                case XBeeProtocol.RAW_802_15_4:
                    xbeePacket = new TX64Packet(GetNextFrameID(), address, (byte)XBeeTransmitOptions.NONE, data);
                    break;
                default:
                    xbeePacket = new TransmitPacket(GetNextFrameID(), address, XBee16BitAddress.UNKNOWN_ADDRESS, 0, (byte)XBeeTransmitOptions.NONE, data);
                    break;
            }
            SendAndCheckXBeePacket(xbeePacket, false);
        }