一台仪器有个可插拔的蓝牙通讯模块,模块自供电。蓝牙插上时,手机App可对其操控,蓝牙拔掉后,App仍然时可以向蓝牙模块发送指令,但发送读取数据指令时,App假死约1分钟,然后崩退。
private BluetoothSocket socket;
当蓝牙模块拔掉后,发送读数据指令时,在Read方法处阻塞。为了预防此场景,通过Stream的IsDataAvailable()方法预先判断是否可读数据。在蓝牙模块未插入情况下,判断正确;但正常插入仪器情况下,误判率较高,常常判断为false了,仪器实际有数据返回,并拥堵在缓冲区,导致下一次执行时,把缓冲区的数据先读出来了,造成错误。
private async void XX_Clicked(object sender, EventArgs e)
{
……
Stream inputStream = socket.InputStream;
if (!IsAvailable(inputStream))
{//预先判断
return;
}
inputStream.Read(bufResponse, 0, bufResponse.Length); //此处阻塞
……
}
//判断是否可读数据
private bool IsAvailable(Stream inputStream)
{
bool isAvailable = false;
int count = 0;
do
{
isAvailable = inputStream.IsDataAvailable();
count++;
} while (!isAvailable && count < 10);
if (!isAvailable)
{
inputStream.Flush(); //此处实际没有什么用
}
return isAvailable;
}
还尝试了在执行Read前设置超时:
inputStream.ReadTimeout = 5000;
但报出Timeouts are not supported on this stream异常。
恳请众位高人赐教,不胜感激。