无法从WinRT中的Arduino蓝牙串行数据中读取数据

时间:2016-01-29 08:42:47

标签: c# bluetooth windows-runtime arduino arduino-uno

我正在使用与蓝牙模块连接的Arduino UNO。我在Arduino中有以下代码,它听取特定输入并发光LED。

int LED= 13;  
char input;  

void setup() 
{  
  Serial.begin(9600);  
  pinMode(LED, OUTPUT);  

  Serial.println(">> START<<");  
  Serial.flush();
}  

void loop() 
{  
  Serial.flush();
  if(Serial.available()>0)  
  {  
    input= Serial.read();  

    if(input=='1')  
    {  
      Serial.write(1);
      Serial.println('a');  
      digitalWrite(LED, HIGH);  
    }  
    else if(input=='0')  
    {  
      Serial.println("OFF");  
      digitalWrite(LED, LOW);  
    }  
    else
    {  
      Serial.println("NO INPUT");  
      Serial.println(input);  
    }  
  }   
}  

从Windows 8.1(XAML / C#)应用程序我通过蓝牙发送数据。并且它按预期完美地工作。但我也试图从Arduino读取数据。为此我在C#中有以下代码。

socket = new StreamSocket();
connectAction = socket.ConnectAsync(rfcommService.ConnectionHostName, rfcommService.ConnectionServiceName, SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
await connectAction;//to make it cancellable
writer = new DataWriter(socket.OutputStream);
reader = new DataReader(socket.InputStream);
Task.Run(() =>
{
       ListenForMessagesAsync();
});

ListenForMessagesAsync方法应该继续监听dataReader。但它只是在等待无限的时间而永远不会回来。

    private async Task ListenForMessagesAsync()
    {
        while (reader != null)
        {
            try
            {
                uint sizeFieldCount = await reader.LoadAsync(1);// taskLoadLength.GetResults();

                if (sizeFieldCount != 1)
                {
                    // The underlying socket was closed before we were able to read the whole data.
                    return;
                }

                // Read the message.
                uint messageLength = reader.ReadByte();
                uint actualMessageLength = await reader.LoadAsync(messageLength);
                if (messageLength != actualMessageLength)
                {
                    // The underlying socket was closed before we were able to read the whole data.
                    return;
                }
                // Read the message and process it.
                string message = reader.ReadString(actualMessageLength);
            }
            catch (Exception ex)
            {
            }
        }
    }

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

成功return后您需要ReadString,当然您需要对message执行某些操作。