0
votes

I am using Arduino UNO connected with bluetooth module. I have this below code in Arduino, which listen to specific input and glow the 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);  
    }  
  }   
}  

From Windows 8.1 (XAML/C#) application I am sending data through bluetooth. And it works perfectly as expected. But I am also trying to read data from Arduino. For that I have below code in 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();
});

The ListenForMessagesAsync method supposed to keep listening the dataReader. But it just waiting for infinite time and never returns.

    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)
            {
            }
        }
    }

What am I doing wrong here?

1
One thing though; why don't you create the Reader inside the task? - Blurry Sterk
That doesn't help. Still behaves same. - Jawahar
I apologize as I cannot see what is wrong with your setup. - Blurry Sterk

1 Answers

0
votes

You need a return after a successful ReadString and of course you need to do something with the message.