Hola:
Te dejo documentación que he hecho con C# y Arduino que puedes ver aquí.
[TUTORIAL] Encender y apagar un Led con Arduino y Visual Studio.
[TUTORIAL] Lecturas de entradas digitales con Arduino y Visual Studio .net.
Lo que buscas sobre leer datos al puerto serie a la vez con C#, puse ejemplos claros sobre este lenguaje y Arduino.
¿Alguna otra pregunta?
Ni estoy por encima de ti, ni estás por encima de mi, simplemente, te acompaño. Tengo ganas de seguirte, como dice Jack el destripador: Vayamos por parte.
Preparo Visual Studio y hago la interfaz desde cero.
Hay cosas como estas que haz puesto, que no es necesario.
string[] datos = new string[3];
//List<string> datos = new List<string>(3);
Especifíca el tipo de motor que usas, motor dc universal, motor PAP, servomotor. Como dice que quieres que indique los grados, no se que pensar. Hasta hice una prueba con un servo.
Te pongo un ejemplo.

Código C#:
using System;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; // No olvidar.
using System.Drawing;
using System.Drawing.Drawing2D;
namespace ServoArduino_01_cs
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button_0_Click(object sender, EventArgs e)
{
int pasos_0;
int.TryParse(button_0.Tag.ToString(), out pasos_0);
trackBar1.Value = pasos_0;
}
private void button_45_Click(object sender, EventArgs e)
{
int pasos_45;
int.TryParse(button_45.Tag.ToString(), out pasos_45);
trackBar1.Value = pasos_45;
}
private void button_90_Click(object sender, EventArgs e)
{
int pasos_90;
int.TryParse(button_90.Tag.ToString(), out pasos_90);
trackBar1.Value = pasos_90;
}
private void button_135_Click(object sender, EventArgs e)
{
int pasos_135;
int.TryParse(button_135.Tag.ToString(), out pasos_135);
trackBar1.Value = pasos_135;
}
private void button_180_Click(object sender, EventArgs e)
{
int pasos_180;
int.TryParse(button_180.Tag.ToString(), out pasos_180);
trackBar1.Value = pasos_180;
}
#region Conectar puerto.
private void Form1_Load(object sender, EventArgs e)
{
button_0.Tag = 0;
button_45.Tag = 45;
button_90.Tag = 90;
button_135.Tag = 135;
button_180.Tag = 180;
// Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
try
{
comboBox_Puerto.DataSource = SerialPort.GetPortNames();
}
catch
{
MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
// Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
comboBox_Puerto.DataSource = SerialPort.GetPortNames();
// // Añade puertos disponibles físicos y virtuales.
serialPort1.PortName = comboBox_Puerto.Text.ToString();
}
// Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
protected override void WndProc(ref Message USB)
{
if (USB.Msg == 0x219)
{
comboBox_Puerto.DataSource = SerialPort.GetPortNames();
}
base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
}
private void button_Conectar_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
serialPort1.Open(); // Abrir puerto.
comboBox_Puerto.Enabled = false;
button_Conectar.Enabled = false;
button_Desconectar.Enabled = true;
// Botones grados.
button_0.Enabled = true;
button_45.Enabled = true;
button_90.Enabled = true;
button_135.Enabled = true;
button_180.Enabled = true;
trackBar1.Enabled = true;
progressBar1.Enabled = true;
}
catch
{
MessageBox.Show("El puerto no existe.", "Aviso:",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void button_Desconectar_Click(object sender, EventArgs e)
{
serialPort1.Close(); // Cerrar puerto.
comboBox_Puerto.Enabled = true;
button_Conectar.Enabled = true;
button_Desconectar.Enabled = false;
// Botones grados.
button_0.Enabled = false;
button_45.Enabled = false;
button_90.Enabled = false;
button_135.Enabled = false;
button_180.Enabled = false;
trackBar1.Enabled = false;
progressBar1.Enabled = false;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) // ¿El puerto está abierto?
{
serialPort1.Close(); // Cerrar puerto.
}
}
#endregion
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
string valor = trackBar1.Value.ToString();
byte[] mBuffer = Encoding.ASCII.GetBytes(valor);
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
// Crear brocha sólida.
SolidBrush fondoNegro = new SolidBrush(Color.Black);
// Crear localización y tamaño del eclipse.
int x = 0;
int y = 0;
int anchura = 100;
int altura = 100;
// Dibujamos un círculo negro.
e.Graphics.FillEllipse(fondoNegro, x, y, anchura, altura);
Pen pen = new Pen(Color.Gray, 8);
pen.StartCap = LineCap.ArrowAnchor;
pen.EndCap = LineCap.RoundAnchor;
e.Graphics.DrawLine(pen, 50, 0, 50, 50);
}
}
}
Código Arduino:
#include <Servo.h>
//Creamos una variable servo para poder usar las funciones con ella.
Servo miservo;
int valor = 0;
int angulo;
int x;
void setup()
{
Serial.begin(115200); // Velocidad en baudios y configuraciçon de inicio.
//Definimos el pin al que ira conectado el servo.
miservo.attach(6); Como salida, el pin 6 con uso de PWM.
//Movemos el servo al centro
miservo.write(90); // Coloca el servo en su posición central.
}
void loop() {
if (Serial.available() > 0) // Espera entrada de datos de 0 a 180.
{
valor = Serial.read(); // Los datos leidos se almacena en la variable valor.
if (valor > 0)
{
x = valor;
}
}
else if ((x >= 0) && (x <= 180))
{
angulo = x;
miservo.write(angulo); // Envía los comando finales de 0 a 180 al servo.
}
/*
long angulo;
if (Serial.available() > 0)
{
angulo = Serial.parseInt();
if ((angulo >= 0) && (angulo <= 180))
{
miservo.write(angulo);
delay(15);
}
}
*/
}
Saludos.
PD: A la próxima pon una captura del programa C# que haz hecho para tener mejor idea.
