C# 如何使用蓝牙插座从游戏控制器接收按钮事件?
目前,我与游戏控制器的蓝牙连接正常。现在我正在尝试捕捉按钮事件,但这并不是那么容易。我有以下代码:C# 如何使用蓝牙插座从游戏控制器接收按钮事件?,c#,android,sockets,bluetooth,xamarin.android,C#,Android,Sockets,Bluetooth,Xamarin.android,目前,我与游戏控制器的蓝牙连接正常。现在我正在尝试捕捉按钮事件,但这并不是那么容易。我有以下代码: private Stream mmInStream; private Stream mmOutStream; public BluetoothController() { } public void Read(BluetoothSocket socket) { Stream tmpIn = null; S
private Stream mmInStream;
private Stream mmOutStream;
public BluetoothController()
{
}
public void Read(BluetoothSocket socket)
{
Stream tmpIn = null;
Stream tmpOut = null;
try
{
tmpIn = socket.InputStream;
tmpOut = socket.OutputStream;
}
catch (IOException ex)
{
throw ex;
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
Thread thread = new Thread(new ThreadStart(Run));
thread.Start();
}
protected void Run()
{
byte[] buffer = new byte[1024];
int bytes;
while (true)
{
try
{
// Thanks to @spaceplane
if (mmInStream.IsDataAvailable())
{
// Read from the InputStream
bytes = mmInStream.Read(buffer, 0, buffer.Length);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
当我按下gamecontroller上的按钮时,它不会进入下一行:
if (mmInStream.IsDataAvailable())
这里出了什么问题?mmInStream.read()
如果流中当前没有可读取的数据,则阻塞。因此,如果没有数据,它将被困在那里等待。在从流中读取之前,您应该检查是否有可用的数据。改变
bytes=mmInStream.Read(buffer,0,buffer.Length)代码>
到
问题解决了。我不需要蓝牙插座。我只是使用了覆盖方法“KeyDown”和“keydup”。现在效果很好:)
如果您需要一个套接字,并且出现了IOException:read failed之类的异常,套接字可能已关闭,那么您应该在此处阅读我的修复程序:
IOException:读取失败,套接字可能已关闭-Android 4.3上的蓝牙谢谢@spaceplane。这就行了!但当我按下游戏控制器上的一个按钮时,它不会进入if语句中。。。但应该可以使用流从游戏控制器读取数据,对吗?问题解决了,请查看我的帖子:
if(mmInStream.available() > 0) {
bytes = mmInStream.Read(buffer, 0, buffer.Length);
}