C# console application talking to Arduino via Blue

2019-04-03 00:21发布

问题:

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.

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()));
            }
        }
    }

回答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!!



回答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);
        }
    }
}