Hola muy buenos dias, tengo un problema a ver si me podria ayudar, tengo un leonardo conectado a un potenciometro en la entrada A0 y quiero leer ese dato mediante Visual Studio con el lenguaje C. El probema es cuando escribo en el puerto serie que lo quiero leer y me peta, es porque cuando el leonardo detecta que otro quiere utilizar el COM se detiene.
Codigo Arduino:
#include
byte v;
void setup()
{
Serial.begin(9600);
while (!Serial);
pinMode(13, OUTPUT);
}
void loop()
{
int rx;
if (Serial.available() > 0)
{
rx = Serial.read();
if (rx == ‘H’) digitalWrite (13, HIGH);
else if (rx == ‘L’) digitalWrite (13, LOW);
}
if (v != analogRead(A0) / 4)
{
v = analogRead(A0) / 4;
Serial.write(v);
}
}
Codigo C(VB):
using System;
using System.IO.Ports;
using System.Threading;
namespace CSharpArduino
{
class Program
{
private static void Encabezado()
{
Console.WriteLine(“————————————–”);
Console.WriteLine(“C# + Arduino usando el System.IO.Ports”);
Console.WriteLine(“————————————–”);
Console.WriteLine(“Guillem Mestre Segui”);
Console.WriteLine(“————————————–”);
}
private static void Pie()
{
Console.WriteLine(“————————————–”);
Console.WriteLine(“COM: ” + puertoArduino);
Console.WriteLine(“LED: ” + LED);
Console.WriteLine(“————————————–”);
}
private static void EsperarParaContinuar()
{
Console.WriteLine(“————————————–”);
Console.WriteLine(“Espere …”);
Console.WriteLine(“————————————–”);
Thread.Sleep(2000);
}
private static void Menu()
{
Encabezado();
Console.WriteLine(“|L| Listar puertos COM disponibles”);
Console.WriteLine(“|S| Setear puerto COM del Arduino”);
Console.WriteLine(“|E| Encender/Apagar LED”);
Console.WriteLine(“|P| Leer POT”);
Console.WriteLine(“|Q| Salir”);
Pie();
}
private static void ListarPuertos()
{
Console.Clear();
Encabezado();
string[] v = SerialPort.GetPortNames();
Array.Sort(v);
foreach (string s in v)
{
Console.WriteLine(s);
}
EsperarParaContinuar();
}
private static byte puertoArduino = 0;
private static void SetearPuertoArduino()
{
Console.Clear();
Encabezado();
Console.WriteLine(“Indicar solo el número de puerto COM”);
Console.WriteLine(“al que se encuentra conectado la placa”);
Console.WriteLine(“————————————–”);
Console.Write(“Número de puerto: “);
try
{
Console.CursorVisible = true;
puertoArduino = byte.Parse(Console.ReadLine());
Console.CursorVisible = false;
if (
Array.Find(
SerialPort.GetPortNames(),
s => s.Equals(“COM” + puertoArduino)
) == null
) throw new Exception();
Console.WriteLine(“Puerto ” + puertoArduino + ” seteado”);
}
catch (Exception)
{
Console.WriteLine(“(!) Puerto incorrecto”);
puertoArduino = 0;
}
EsperarParaContinuar();
}
private static bool LED = false;
private static void EncenderLED()
{
using (SerialPort sp = new SerialPort(“COM” + puertoArduino, 9600))
{
sp.Open();
sp.Write(LED ? “L” : “H”);
sp.Close();
}
LED = !LED;
}
private static void LeerPOT()
{
Console.Clear();
Console.WriteLine(“————————————–”);
Console.WriteLine(“POT: 0?);
Console.WriteLine(“————————————–”);
Console.WriteLine(“Presione una tecla para regresar …”);
Console.WriteLine(“————————————–”);
using (SerialPort sp = new SerialPort(“COM” + puertoArduino, 9600))
{
sp.Open();
while (!Console.KeyAvailable)
{
Console.SetCursorPosition(7, 1);
sp.DiscardInBuffer();
//Thread.Sleep(10000); //pausa de 10 segundos.
Console.WriteLine(sp.ReadByte().ToString().PadLeft(3, ‘ ‘)); //peta en esta linea cuando leemos poten
}
sp.Close();
}
}
static void Main()
{
while (true)
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Green;
Console.CursorVisible = false;
Menu();
char c = Console.ReadKey(true).KeyChar;
switch (char.ToUpper(c))
{
case ‘L’:
ListarPuertos();
break;
case ‘S’:
SetearPuertoArduino();
break;
case ‘E’:
if (puertoArduino != 0) EncenderLED();
break;
case ‘P’:
if (puertoArduino != 0) LeerPOT();
break;
case ‘Q’:
return;
}
}
}
}
}
PD: Tambien seleccionamos el com y encendemos/apagamos el led. Funciona perfectamente en arduino UNO por tener dos micros uno para el programa y otro para la comunicacion, pero en el caso de leonard no funciona… Sabrias ayudarme? Muchas gracias de antemano.