我正在开发一个关于Android和iOS应用程序的项目(使用Xamarin Forms)。
此应用程序将能够发现并连接OBD2并与之通信以获取有关汽车的一些数据。
我的问题是下一个问题;在Android中,当我开始从设备发送和接收数据时,第一次通信没问题,我发送了一个ASCII码,设备响应我。但接下来,我发送了另一个ASCII码,当我想读取时,方法BluetoothSocket.InputStream.IsDataAvailable()是假的,所以我不能读更多,而且我不知道怎么做“unblock”这个读取阅读下一个回复。
我的代码:
获取蓝牙插座.-
socket = device.CreateRfcommSocketToServiceRecord(uuid.Uuid);
//如果第一次失败 socket = device.CreateInsecureRfcommSocketToServiceRecord(uuid.Uuid);
向设备发送信息(第一次通话):
byte[] cmd = new byte[6];
cmd[0] = 02;
cmd[1] = 65;
cmd[2] = 84;
cmd[3] = 32;
cmd[4] = 90;
cmd[5] = 03;
//cmd[6] = 04;
socket.OutputStream.Write(cmd, 0, cmd.Length);
if (Read().Equals("")){
throw new System.Exception();
}
socket.OutputStream.Flush();
cmd[0] = 02;
cmd[1] = 65;
cmd[2] = 84;
cmd[3] = 32;
cmd[4] = 68;
cmd[5] = 03;
//cmd = Encoding.ASCII.GetBytes("AT Z");
socket.OutputStream.Write(cmd, 0, cmd.Length);
Console.WriteLine("After second write InputStream.IsDataAvailable="+socket.InputStream.IsDataAvailable()); //Always false
if (Read().Equals("")){
throw new System.Exception();
}
socket.OutputStream.Flush();
阅读回复:
private string Read()
{
//También probado con BufferedReader.ready() para comprobar si el stream está listo para leer; mismo resultado.
string data = "";
try
{
System.Text.StringBuilder builder = new System.Text.StringBuilder();
char c;
byte a;
byte[] buffer = new byte[1024];
//Este tipo de socket no soporta Timeouts
if (socket.InputStream.IsDataAvailable()) //only entry first time
{
int bytes = socket.InputStream.Read(buffer, 0, buffer.Length);
//while (((a = (byte)socket.InputStream.ReadByte()) > -1))
for (int i = 0; i < bytes; i++)
{
a = buffer[i];
c = (char)a;
if (c.Equals('\r')) //Comprobado \r es el último caracter, no llega a ETX
{
break;
}
builder.Append(c);
}
data = builder.ToString();
Console.WriteLine("Información: " + data);
socket.InputStream.Flush();
}
else
{
Console.WriteLine("Input Stream no disponible");
}
}
catch (System.Exception e)
{
Console.WriteLine("Error de lectura :"+e.Message);
}
return data;
}
我想解决这个问题,因为我必须在不等待的情况下向设备发送大量信息。