You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio中使用Dragino LA66 USB LoRa模块与Arduino通信失败的技术求助

Android Studio中使用Dragino LA66 USB LoRa模块与Arduino通信失败的技术求助

我正在开发一款控制无人机的Android应用,采用Dragino LA66 USB LoRa模块实现与Arduino板的通信。目前遇到的核心问题是:应用能识别到LA66模块,但无论怎么尝试,都无法将数据传输到Arduino端——Arduino通过IDE监控串口,完全收不到任何来自LoRa的内容。下面是我的具体实现和遇到的问题,希望能得到大家的指点。

已尝试的实现步骤与代码

1. 最初的串口发送代码

我先基于普通串口通信写了发送数据的方法,应用能识别USB设备,但调用此方法发送数据时,Arduino端毫无反应:

public static void sendComm(String msg) {
    byte[] msgBuff = msg.getBytes();
    int msgLen = msgBuff.length;

    if (serialPort != null) {
        try {
            serialPort.write(msgBuff, msgLen);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. USB设备识别与权限请求

这部分代码在Activity的onCreate()中立即执行,用于识别LA66模块并请求权限:

for (UsbDevice device : deviceList.values()) {
    PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.aidan.dronecontroller.USB_PERMISSION"), PendingIntent.FLAG_IMMUTABLE);

    if (device.getVendorId() == 4292 && device.getProductId() == 60000) {
        usbManager.requestPermission(device, permissionIntent);

        if (usbManager.hasPermission(device)) {
            GlobalState.getInstance().setUSBConnected(true);
        }
    }

    la66 = device;
}

3. 串口打开与LoRa配置

打开串口并尝试发送AT指令配置LA66模块,这部分执行后依然没有通信迹象:

private void openSerialPort(UsbDevice device) {
    UsbDeviceConnection connection = usbManager.openDevice(device);
    UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);

    if (driver == null) {
        // 尝试更激进的探测(后来发现这里和上面的探测逻辑重复了)
        driver = UsbSerialProber.getDefaultProber().probeDevice(device);
    }

    if (driver != null) {
        UsbSerialPort port = driver.getPorts().get(0);

        try {
            port.open(connection);
            port.setParameters(
                    9600, // 波特率
                    8,      // 数据位
                    UsbSerialPort.STOPBITS_1,
                    UsbSerialPort.PARITY_NONE
            );

            serialPort = port;

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 尝试发送AT指令配置LoRa参数
    la66Msg = "AT+FRE="+freq+","+freq;
    sendComm(la66Msg);

    la66Msg = "AT+BW="+bw+","+bw;
    sendComm(la66Msg);

    la66Msg = "AT+SF="+sf+","+sf;
    sendComm(la66Msg);

    la66Msg = "AT+CR="+cr+","+cr;
    sendComm(la66Msg);
}

其他尝试

我还试过用Dragino官方提供的示例app,但示例主要是日志输出,没有完整的发送数据逻辑,照着改后依然无法实现通信。

我的疑问与求助点

作为硬件+软件结合的新手,我实在找不到问题出在哪里,想请教大家:

  • 我的USB权限请求逻辑有没有问题?比如在onCreate()中直接请求,是不是权限还没获取到就执行了后续的串口操作?
  • 打开串口后发送AT指令的方式是否正确?会不会是模块没被正确配置,导致无法发送LoRa数据?
  • 串口参数(波特率、数据位等)需要和Arduino端的LoRa模块完全一致吗?我目前是两边都设的9600/8/1/无校验,但不确定是不是这个问题。
  • 有没有可能串口打开过程中出现了隐性错误,但我的错误处理不够完善,没捕捉到?

麻烦大家帮我看看哪里出问题了,或者有没有更规范的LA66模块Android开发流程可以参考?谢谢大家!

火山引擎 最新活动