Есть сторонняя плата с чипом Bluegiga на борту. Планшет подключается по Bluetooth к плате и время от времени посылает ей запросы, на которые получает ответы (объем 2-3 сообщения (около 100 байт) в секунду). Все работает стабильно до тех пор, пока плата не начинает передавать команды чаще (раз в 10). При этом планшет в какой-то момент (через 1-2 минуты после установки связи) подвисает, а затем генерирует исключение (причем видно обрывок не дошедшего сообщения). В чем может быть причина? На телефоне Huawei Sonic все работает без подобных глюков. Если связать телефон с планшетом и эмулировать плату на телефоне — тоже все нормально.
Привожу функцию чтения из сокета:
public void run()
{
final int BufferSize = 0x400;
byte[] buffer = new byte[BufferSize];
int bufferCursor = 0;
int bufferRemainder = 0;
final int MessageBufferSize = 0x400;
byte[] message = new byte[MessageBufferSize];
int cursor = 0;
int bytes = 0;
while(true)
{
try
{
if(bufferRemainder == 0)
{
bufferCursor = 0;
bufferRemainder = BufferSize;
}
bytes = mmInStream.read(buffer, bufferCursor, bufferRemainder);
if(bytes >= 0)
{
bufferCursor += bytes;
bufferRemainder -= bytes;
for(int i = bufferCursor - bytes; i < bufferCursor; ++i)
{
message[cursor] = buffer[i];
//35 #
//36 $
//13 \r
//10 \n
if(cursor == 0)
{
if(buffer[i] == 35 || buffer[i] == 36)
cursor++;
}
else if(buffer[i] == 13)
{
mHandler.obtainMessage(MESSAGE_READ, cursor, -1, message.clone()).sendToTarget();
cursor = 0;
}
else if(buffer[i] != 10)
cursor++;
if(cursor == BufferSize)
cursor = 0;
}
}
}
catch(IOException readException)
{
if(cursor > 0)
{
message[0] = 111;
mHandler.obtainMessage(MESSAGE_READ, cursor, -1, message.clone()).sendToTarget();
cursor = 0;
}
Log.e(TAG, "Failed to read from input stream: " + readException.getMessage());
connectionLost();
break;
}
}
}