You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino蓝牙连接需特定函数?Android与Arduino蓝牙连接故障求助

Arduino蓝牙连接问题排查与解决方案

一、Arduino端是否需要特定蓝牙函数?

对于常用的经典蓝牙SPP模块(如HC-05/HC-06),不需要额外的特定函数——这类模块采用「串口透传」模式,只要Arduino通过串口和模块通信,模块就会自动把数据通过蓝牙转发,反之亦然。你只需要:

  • 确保蓝牙模块的波特率和Arduino代码中的Serial.begin()参数一致(比如HC-05默认波特率为9600)
  • 用Serial.print()/Serial.println()发送传感器数据即可,示例代码:
void setup() {
  Serial.begin(9600); // 与蓝牙模块波特率保持一致
  // 此处添加传感器初始化代码
}

void loop() {
  int sensorValue = analogRead(A0); // 读取传感器数值
  Serial.println(sensorValue); // 通过蓝牙发送数据
  delay(1000);
}

如果使用BLE蓝牙模块(如nRF52832),则需要使用对应Arduino库(如BLEPeripheral)定义服务和特征,但这类模块在Arduino-Android场景中使用较少。

二、Android端连接失败的排查与修复

1. 扫描不到Arduino蓝牙设备的常见原因

  • 蓝牙模块未进入可配对模式:HC-05需长按配对按键直到指示灯快速闪烁,才会进入可被扫描状态;HC-06默认开机可扫描,但部分模块需通过AT指令配置。
  • Android权限缺失:
    • Android 6.0+ 需要动态申请ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION权限
    • Android 12+ 还需额外申请BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限
      必须在代码中添加权限申请逻辑,确保用户授权后再执行扫描操作。
  • 波特率不匹配:Arduino代码的Serial.begin()波特率必须和蓝牙模块实际波特率一致,否则模块无法正常工作,自然无法被扫描到。
  • 供电不足:蓝牙模块需要稳定的3.3V/5V供电,若使用Arduino引脚供电可能导致电压不足,信号减弱甚至无法被扫描。

2. 能扫描到但无法连接的原因

  • 配对码错误:HC-05默认配对码为1234或0000,Android设备配对时必须输入正确代码。
  • BluetoothSPP库初始化不全:你的代码缺少蓝牙服务初始化步骤,需在onCreate()中添加:
bt = new BluetoothSPP(this);
if (!bt.isBluetoothAvailable()) {
    Toast.makeText(this, "蓝牙不可用", Toast.LENGTH_SHORT).show();
    finish();
}
bt.setupService();
bt.startService(BluetoothState.DEVICE_OTHER); // 启动服务,用于连接外部设备
  • UUID错误:SPP协议标准UUID为00001101-0000-1000-8000-00805F9B34FB,若DeviceList页面使用错误UUID,会导致连接失败。

3. 替换已弃用的startActivityForResult

startActivityForResult已被弃用,需改用ActivityResultLauncher获取设备选择结果,修改后的代码如下:

// 定义Activity成员变量
private ActivityResultLauncher<Intent> connectDeviceLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 初始化ActivityResultLauncher
    connectDeviceLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                String deviceAddress = result.getData().getStringExtra(BluetoothState.EXTRA_DEVICE_ADDRESS);
                bt.connect(deviceAddress); // 连接选中的蓝牙设备
            }
        }
    );

    Button btnConnect = findViewById(R.id.btnConnect);
    btnConnect.setOnClickListener(v -> {
        Toast.makeText(getApplicationContext(), "Button Clicked", Toast.LENGTH_SHORT).show();
        if (bt.getServiceState() == BluetoothState.STATE_CONNECTED) {
            Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "Trying to Connect", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(getApplicationContext(), DeviceList.class);
            connectDeviceLauncher.launch(intent); // 替代startActivityForResult
        }
    });

    // 数据接收监听保留原有逻辑,添加数组越界防护
    bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() {
        TextView dist = findViewById(R.id.data);
        @Override
        public void onDataReceived(byte[] data, String message) {
            Toast.makeText(getApplicationContext(), "Data receiving available", Toast.LENGTH_SHORT).show();
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
            Log.d("Y message : ", message);
            Log.d("Y data : ", String.valueOf(data));
            String[] array = message.split(",");
            if (array.length > 0) { // 避免数组越界崩溃
                dist.setText(array[0].concat("cm"));
            }
        }
    });
}

三、额外注意事项

  • 确保Android设备蓝牙已开启,且与Arduino蓝牙模块距离在有效范围内(通常10米内)
  • 测试时可先用手机系统蓝牙设置尝试配对Arduino模块,确认配对成功后再用代码连接
  • 若使用HC-05模块,可通过AT指令确认模块名称、波特率、配对码等参数是否正确

内容的提问来源于stack exchange,提问作者Young.J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:30:53