Как получить серийные данные с помощью Android-bluetooth

Я новичок в android. Я разрабатываю приложение для Android, которое получает последовательные данные с аппаратного устройства через Bluetooth. Я работаю над желанием Htc S. Я использовал образец кода чата Bluetooth для получения данных. Но полученные данные неверны. Он пропускает некоторые значения. Может ли кто-нибудь предоставить мне любой другой пример кода для получения большого количества данных через Bluetooth и сохранить его в файле.

Solutions Collecting From Web of "Как получить серийные данные с помощью Android-bluetooth"

Попробуйте этот код:

Мероприятия:

package Android.Arduino.Bluetooth; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.TextView; import android.widget.EditText; import android.widget.Button; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class MainActivity extends Activity { TextView myLabel; EditText myTextbox; BluetoothAdapter mBluetoothAdapter; BluetoothSocket mmSocket; BluetoothDevice mmDevice; OutputStream mmOutputStream; InputStream mmInputStream; Thread workerThread; byte[] readBuffer; int readBufferPosition; int counter; volatile boolean stopWorker; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button openButton = (Button)findViewById(R.id.open); Button sendButton = (Button)findViewById(R.id.send); Button closeButton = (Button)findViewById(R.id.close); myLabel = (TextView)findViewById(R.id.label); myTextbox = (EditText)findViewById(R.id.entry); //Open Button openButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { findBT(); openBT(); } catch (IOException ex) { } } }); //Send Button sendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { sendData(); } catch (IOException ex) { } } }); //Close button closeButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { closeBT(); } catch (IOException ex) { } } }); } void findBT() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(mBluetoothAdapter == null) { myLabel.setText("No bluetooth adapter available"); } if(!mBluetoothAdapter.isEnabled()) { Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBluetooth, 0); } Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); if(pairedDevices.size() > 0) { for(BluetoothDevice device : pairedDevices) { if(device.getName().equals("MattsBlueTooth")) { mmDevice = device; break; } } } myLabel.setText("Bluetooth Device Found"); } void openBT() throws IOException { UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); mmSocket.connect(); mmOutputStream = mmSocket.getOutputStream(); mmInputStream = mmSocket.getInputStream(); beginListenForData(); myLabel.setText("Bluetooth Opened"); } void beginListenForData() { final Handler handler = new Handler(); final byte delimiter = 10; //This is the ASCII code for a newline character stopWorker = false; readBufferPosition = 0; readBuffer = new byte[1024]; workerThread = new Thread(new Runnable() { public void run() { while(!Thread.currentThread().isInterrupted() && !stopWorker) { try { int bytesAvailable = mmInputStream.available(); if(bytesAvailable > 0) { byte[] packetBytes = new byte[bytesAvailable]; mmInputStream.read(packetBytes); for(int i=0;i<bytesAvailable;i++) { byte b = packetBytes[i]; if(b == delimiter) { byte[] encodedBytes = new byte[readBufferPosition]; System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); final String data = new String(encodedBytes, "US-ASCII"); readBufferPosition = 0; handler.post(new Runnable() { public void run() { myLabel.setText(data); } }); } else { readBuffer[readBufferPosition++] = b; } } } } catch (IOException ex) { stopWorker = true; } } } }); workerThread.start(); } void sendData() throws IOException { String msg = myTextbox.getText().toString(); msg += "\n"; mmOutputStream.write(msg.getBytes()); myLabel.setText("Data Sent"); } void closeBT() throws IOException { stopWorker = true; mmOutputStream.close(); mmInputStream.close(); mmSocket.close(); myLabel.setText("Bluetooth Closed"); } } 

И вот макет:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:ignore="TextFields,HardcodedText" > <TextView android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Type here:" /> <EditText android:id="@+id/entry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/label" android:background="@android:drawable/editbox_background" /> <Button android:id="@+id/open" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@id/entry" android:layout_marginLeft="10dip" android:text="Open" /> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/open" android:layout_toLeftOf="@id/open" android:text="Send" /> <Button android:id="@+id/close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/send" android:layout_toLeftOf="@id/send" android:text="Close" /> 

Здесь для манифеста: добавьте в приложение ~~

 </application> 

// разрешение должно быть включено

Я попробовал это для передачи непрерывных данных (значения с плавающей точкой, преобразованных в строку) с моего ПК (MATLAB) на мой телефон. Но, все еще мое приложение неправильно читает разделитель '\ n', и все же данные искажаются. Итак, я взял символ «N» в качестве разделителя, а не «\ n» (это может быть любой символ, который не встречается как часть ваших данных), и я добился лучшей скорости передачи – я дал всего 0,1 секундную задержку Между передачей последовательных выборок – с более чем 99% целостностью данных в приемнике, т.е. из 2000 отсчетов (значений поплавка), которые я передал, только 10 не были правильно декодированы в моем приложении.

Мой короткий ответ: выберите разделитель, отличный от '\ r' или '\ n', поскольку они создают больше проблем для передачи данных в реальном времени по сравнению с другими символами, такими как тот, который я использовал. Если мы будем работать больше, возможно, мы сможем увеличить скорость передачи еще больше. Надеюсь, мой ответ поможет кому-то!

Проблема с нулевым соединением связана с функцией findBT (). Вы должны изменить имя устройства с «MattsBlueTooth» на ваше имя устройства, а также подтвердить UUID для вашего сервиса / устройства. Используйте что-то вроде приложения BLEScanner, чтобы подключиться как к Android.

Взгляните на невероятный класс Bluetooth Serial, который обладает способностью onResume() которая мне очень помогла. Надеюсь, это поможет 😉