我正在尝试编写一个可以读取和写入通过串行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连接它时,设置没有改变。
有什么我可能会忽略的可能导致这个问题吗?我花了很多时间试图解决这个问题并且尚未提出解决方案。