Buongiorno a tutti
sto cercando di far comunicare il mio Arduino Leonardo con il PC. Ho pensato quindi di usare la porta USB e una applicazioncina C# (perché l'idea è quella di costruire in seguito una applicazione con interfaccia grafica Windows Form), ma ho qualche problema con la lettura dei dati provenienti da Arduino.
Ho caricato sul mio Leonardo lo sketch di esempio Event Serial
/*
Serial Event example
When new serial data arrives, this sketch adds it to a String.
When a newline is received, the loop prints the string and
clears it.
A good test for this is to try it with a GPS receiver
that sends out NMEA 0183 sentences.
Created 9 May 2011
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/SerialEvent
*/
#define LED 13 // LED collegato al pin digitale 13
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
// initialize serial:
Serial.begin(9600);
// reserve 200 bytes for the inputString:
inputString.reserve(200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
digitalWrite(LED, HIGH); // accende il LED
}
digitalWrite(LED, LOW); // accende il LED
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
if(Serial.available() > 0)
serialEvent();
}
void serialEvent() {
while (Serial.available()) {
digitalWrite(LED, HIGH);
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
digitalWrite(LED, LOW);
}
}
}
Innanzi tutto ho scoperto che, contrariamente a quanto dice la documentazione la funzione **serialEvents()**non viene chiamata automaticamente al termine di ogni chiamata a loop(). Poco male... ho messo io la chiamata all'interno di loop.
A questo punto utilizzando il monito seriale dell'IDE ho avuto la controprova che lo sketch funziona: se invio la stringa 'Ciao' a Leonardo lui mi risponde con 'Ciao'.
Grande successo!!!
Passando alla parte C# ho scritto questa classe seguendo le indicazioni di Microsoft:
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
namespace SimpleUsbWriter2
{
class Program
{
static void Main(string[] args)
{
bool _continue = true;
SerialPort mySerialPort = new SerialPort("COM4");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.NewLine = "\n";
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
while (_continue)
{
String s = Console.ReadLine();
if (s.Equals("exit"))
{
_continue = false;
break;
}
mySerialPort.WriteLine(s);
}
mySerialPort.Close();
}
private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
Console.Write("DataReceivedHandler");
SerialPort sp = (SerialPort)sender;
Console.WriteLine("Data Received: " + sp.BytesToRead);
string indata = sp.ReadExisting();
Console.Write(indata);
}
}
}
e qui nasce il problema. I dati vengono inviati ad Arduino (o almeno così pare, perché il LED RX blinka) ma non tornano indietro: il metodo DataReceivedHandler() non viene mai invocato.
Dove sto sbagliando? Qualcuno ha qualche suggerimento?
Grazie a tutti
Ps: C'è un modo per fare debug del codice che gira in arduino? Inserire breack point e far avanzare le istruzioni step by step?