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权限
必须在代码中添加权限申请逻辑,确保用户授权后再执行扫描操作。
- Android 6.0+ 需要动态申请
- 波特率不匹配: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
相关产品推荐
相关产品推荐

