使用Xamarin / Android的蓝牙到串行设备

时间:2015-01-27 18:47:48

标签: c# android bluetooth xamarin serial-port

我正在尝试编写一个可以读取和写入通过串行com端口接受普通串行通信的设备的应用程序。我正在使用蓝牙连接设备。蓝牙到串行设备是一个bolutek BK-MD-BC04-B_DEMO。它基本上是一个带有串口的蓝牙设备。

我可以使用Android手机连接到设备,我可以向其发送数据。我的计算机连接到蓝牙设备上的串口使用COM5上的PuTTY和USB转串口,我可以看到我使用Android手机发送的数据。但是,当我将蓝牙适配器连接到我的串行设备时,我似乎无法使串行命令正常工作。我也无法从蓝牙适配器读回任何内容。

我已经确认所有串行设置似乎都是正确的。波特率,数据位,停止位和奇偶校验都在蓝牙设备上正确设置。

我试图通过电子邮件联系bolutek,但他们回复的速度很慢。以下是我在设备上找到的一些内容:

http://www.electrodragon.com/w/index.php?title=BC04

http://docs.teguna.ro/BC04-electrondragon-2013-01-17.pdf

http://diwo.bq.com/wp-content/uploads/2014/11/BLK-MD-BC04-B_AT-COMMANDS.pdf

这是我的代码:

using System;
using System.Linq;
using System.IO;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Android.Bluetooth;

//...

public class MainActivity : Activity
{
    private BluetoothSocket socket;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        Button button = FindViewById<Button>(Resource.Id.MyButton);
        EditText text = FindViewById<EditText>(Resource.Id.editText);

        button.Click += delegate
        {
            BluetoothAdapter adapter = BluetoothAdapter.DefaultAdapter;

            Action finish = new Action(async delegate
            {
                if (socket == null)
                {
                    BluetoothDevice device = (from bd in adapter.BondedDevices where bd.Name == "BOLUTEK" select bd).FirstOrDefault();

                    if (device == null)
                    {
                        AndroidMethods.message("Error", "BOLUTEK device not found. Please make sure you are paired with the BOLUTEK device.",
                            "OK", this);
                        return;
                    }

                    socket = device.CreateRfcommSocketToServiceRecord(Java.Util.UUID.FromString("00001101-0000-1000-8000-00805f9b34fb"));
                }
                if (!socket.IsConnected)
                    await socket.ConnectAsync();

                string outString = text.Text + "\r";
                string wakeString = "\t\r";

                byte[] output = charsToBytes(outString.ToCharArray());
                byte[] wakeUp = charsToBytes(wakeString.ToCharArray());

                await socket.OutputStream.WriteAsync(wakeUp, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(wakeUp, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(wakeUp, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(output, 0, output.Length);

                byte[] output2 = stringToBytes(outString);
                byte[] wakeUp2 = stringToBytes(wakeString);

                await socket.OutputStream.WriteAsync(wakeUp2, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(wakeUp2, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(wakeUp2, 0, wakeUp.Length);
                await socket.OutputStream.WriteAsync(output2, 0, output.Length);

            });

            if (socket != null)
                finish();
            else if (adapter == null)
            {
                AndroidMethods.message("Error", "No bluetooth adapter found.", "OK", this);
                return;
            }
            else if (!adapter.IsEnabled)
            {
                DialogBuilder.createConfirmDialog(this, "Error", "Bluetooth adapter is not enabled. Would you like to enable it now?",
                    "No", "Yes", delegate
                    {
                        adapter.Enable();
                        finish();
                    });
            }
            else
                finish();
        };
    }

    public static byte[] stringToBytes(string value)
    {
        byte[] bytes = new byte[value.Length * sizeof(char)];
        System.Buffer.BlockCopy(value.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    public static string bytesToString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }

    public static byte[] charsToBytes(char[] chars)
    {
        int length = chars.Length;
        byte[] returnVal = new byte[length];
        for (int x = 0; x < length; x++)
            returnVal[x] = (byte)chars[x];
        return returnVal;
    }
}

你会注意到我正在使用两种不同的方法将字符串转换为字节数组。其中一个只是创建一个char数组并将其转换为字节数组,而另一个将字符串数组转换为字节数组,每个字节用0分隔。当我正在观看传入的蓝牙到串行通信时,这两种方法都可以工作在我的电脑上。

要与串口设备通信,我通常会使用PuTTY并按Tab键然后在键盘上输入。这将串行设备置于命令模式。你可以多次这样做。因此“\ t \ r \ n”。发送“\ t \ t \ r \ n”后,您应该能够输入一个命令后跟一个“\ r”。所以在PuTTY中,我会在键盘上输入类似“(tab)(enter)commandstring(enter)”的内容。我发送的命令应该更改串口设备上的一些设置,但是当我通过PuTTY连接它时,设置没有改变。

有什么我可能会忽略的可能导致这个问题吗?我花了很多时间试图解决这个问题并且尚未提出解决方案。

0 个答案:

没有答案