C# console application talking to Arduino via Bluetooth

18,766

Solution 1

Okay so there were a few issues that are hard to see from above so I will attempt to explain.

First, RX and TX on the bluetooth card DO NOT go to their equals on the arduino. They go to their opposites.

Example:

Bluetooth Card RX -> TX on Arduino

Bluetooth Card TX -> RX on Arduino

So if you look in the photo of the Arduino above it should be painfully obvious that pins 7 and 8 are the incorrect placement.

The next issue that I was having was poor connectivity.

The power and ground seem to be fine in the above configuration. However, the RX and TX connections need to be soldered in. Otherwise you get a poor connection.

Once I made this changes the above code worked flawlessly.

Hope this helps anyone else having these issues!!

Solution 2

Here is similar code simplified for testing the PC <-> Arduino BT communication. In the code below, the PC sends text to the Arduino, which then echoes it back to the PC. PC writes the incoming text to console.

Set your BT serial port (COM5 in the example) from Windows.

Tested with Arduino Uno, an USB-Bluetooth dongle and the bluetooth module HC-05. Arduino's PIN1(TX) voltage was divided from 5V to 2.5V before feeding it to the module's RX pin).

That's it. Easy!

Arduino:

void setup() {
    Serial.begin(9600); 
    delay(50);
}

void loop() {
    if (Serial.available())
    Serial.write(Serial.read()); // echo everything
}

C#:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;

public class SerialTest
{
    public static void Main()
    {
        SerialPort serialPort = new SerialPort();
        serialPort.BaudRate = 9600;
        serialPort.PortName = "COM5"; // Set in Windows
        serialPort.Open();
        int counter = 0;
        while (serialPort.IsOpen)
        {
            // WRITE THE INCOMING BUFFER TO CONSOLE
            while (serialPort.BytesToRead > 0)
            {
                Console.Write(Convert.ToChar(serialPort.ReadChar()));
            }
            // SEND
            serialPort.WriteLine("PC counter: " + (counter++));
            Thread.Sleep(500);
        }
    }
}
Share:
18,766
DotNetRussell
Author by

DotNetRussell

By Day: .NET Engineer specializing in UWP/WPF, Winforms, C#, XAML By Night: UWP, Arduino, Web Deving, Vulnhub and 3D Printing Currently studying info-sec. I love everything that I can hook up a logic analyser to or that I can decompile. I enjoy mixing the two.

Updated on June 04, 2022

Comments

  • DotNetRussell
    DotNetRussell almost 2 years

    Not a whole lot to say here other than this doesn't work, and I have no idea why.

    The serial output on the Arduino is nothing. The output on the C# code goes down to waiting for a response and then nothing.

    The Bluetooth card LED on the Arduino goes green when I start the C# program so there is a connection being made. Just nothing else.

    Enter image description here Enter image description here

    Arduino Code

    #include <SoftwareSerial.h> //Software Serial Port
    #define RxD 8 // This is the pin that the Bluetooth (BT_TX) will transmit to the Arduino (RxD)
    #define TxD 7 // This is the pin that the Bluetooth (BT_RX) will receive from the Arduino (TxD)
    
    SoftwareSerial blueToothSerial(RxD,TxD);
    boolean light = false;
    void setup(){
      Serial.begin(9600); // Allow Serial communication via USB cable to computer (if required)
      pinMode(RxD, INPUT); // Setup the Arduino to receive INPUT from the bluetooth shield on Digital Pin 6
      pinMode(TxD, OUTPUT); // Setup the Arduino to send data (OUTPUT) to the bluetooth shield on Digital Pin 7
      pinMode(13,OUTPUT); // Use onboard LED if required.
    }
    
    void loop(){
       delay(1000);
       if(light){
          light = false;
          digitalWrite(13,LOW);
       }
       else{
         light = true;
         digitalWrite(13,HIGH);
       }
       //Serial.println(blueToothSerial.available());
       blueToothSerial.write("Im alive");
       if(blueToothSerial.read()>0){
         Serial.write(blueToothSerial.read());
       }
    }
    

    Core C# Code

    static void Main(string[] args)
            {
            byte[] Command = Encoding.ASCII.GetBytes("It works");//{0x00,0x01,0x88};
    
            SerialPort BlueToothConnection = new SerialPort();
            BlueToothConnection.BaudRate = (9600);
    
            BlueToothConnection.PortName = "COM4";
            BlueToothConnection.Open();
            if (BlueToothConnection.IsOpen)
            {
    
                BlueToothConnection.ErrorReceived += new SerialErrorReceivedEventHandler(BlueToothConnection_ErrorReceived);
    
                // Declare a 2 bytes vector to store the message length header
                Byte[] MessageLength = { 0x00, 0x00 };
    
                //set the LSB to the length of the message
                MessageLength[0] = (byte)Command.Length;
    
    
                //send the 2 bytes header
                BlueToothConnection.Write(MessageLength, 0, MessageLength.Length);
    
                // send the message itself
    
                System.Threading.Thread.Sleep(2000);
                BlueToothConnection.Write(Command, 0, Command.Length);
    
                Messages(5, ""); //This is the last thing that prints before it just waits for response.
    
                int length = BlueToothConnection.ReadByte();
                Messages(6, "");
                // retrieve the reply data
                for (int i = 0; i < length; i++)
                {
                    Messages(7, (BlueToothConnection.ReadByte().ToString()));
                }
            }
        }
    
  • Alex Horlock
    Alex Horlock about 6 years
    Thank you so much for this, worked perfectly for me with a HC-06 bluetooth device and a windows 10 laptop. I had to change the thread.Sleep to 1000, i'm not sure why.