2011-11-27 22 views
9

Desarrollé una aplicación que envía datos para un Arduino por el puerto serie, pero no puedo entender cómo puedo recibirlo en el Arduino. Envío una cadena por el puerto serie para el Arduino y el Arduino lo recibe, pero no funciona en mi código (en el Arduino, recibo un byte a la vez).¿Cómo puedo recibir datos de una PC en un Arduino?

Actualización: que está funcionando;)

El código en C# que envía datos:

using System; 
using System.Windows.Forms; 

using System.Threading; 
using System.IO; 
using System.IO.Ports; 

pulic class senddata() { 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     //Define a serial port. 
     serialPort1.PortName = textBox2.Text; 
     serialPort1.BaudRate = 9600; 
     serialPort1.Open(); 
    } 

    private void button1_Click(object sender, System.EventArgs e) 
    { 
     serialPort1.Write("10"); //This is a string. The 1 is a command. 0 is interpeter. 
    } 
} 

El código de Arduino:

Tengo actualizar el código

#include <Servo.h> 

Servo servo; 
String incomingString; 
int pos; 

void setup() 
{ 
    servo.attach(9); 
    Serial.begin(9600); 
    incomingString = ""; 
} 

void loop() 
{ 
    if(Serial.available()) 
    { 
     // Read a byte from the serial buffer. 
     char incomingByte = (char)Serial.read(); 
     incomingString += incomingByte; 

     // Checks for null termination of the string. 
     if (incomingByte == '0') { //When 0 execute the code, the last byte is 0. 
      if (incomingString == "10") { //The string is 1 and the last byte 0... because incomingString += incomingByte. 
       servo.write(90); 
      } 
      incomingString = ""; 
     } 
    } 
} 
+0

tal vez un mejor lugar para preguntar: http: //electronics.stackexchange.com/ – vikingosegundo

Respuesta

3

Algunas de las cosas que hacen que la ceja aumento:

serialPort1.Write("1"); 

Este escribirán exactamente un byte, el 1, pero no hay ninguna nueva línea y arrastra NUL-Byte. Pero aquí están a la espera de un byte adicional NUL:

if (incomingByte == '\0') { 

Se debe utilizar en lugar de WriteLineWrite, y esperar a que \n en lugar de \0.

Esto tiene dos efectos secundarios:

Primero: Si hay algo de búfer configurado, entonces hay una cierta posibilidad, de una nueva línea empujará a los datos almacenados en el Arduino. Para estar seguro, debe buscar en los documentos en MSDN.

Segundo: Esto hace que su protocolo sea solo ASCII. Esto es importante para una depuración más fácil. A continuación, puede utilizar un programa terminal de llanura como Hyperterm o HTerm (edición) o incluso el Monitor de serie en el propio IDE Arduino (edición) para depurar el Arduino-código sin tener que preocuparse acerca de los errores en su código C#. Y cuando el código Arduino funciona, puedes concentrarte en la parte C#. Divide y vencerás.

Editar: Otra cosa que me di cuenta después de cavar mi propia Arduino:

incomingString += incomingByte; 
.... 
if (incomingByte == '\n') { // modified this 
    if(incomingString == "1"){ 

Esto por supuesto no funciona como se esperaba, debido a que la cadena contendrá "1 \ n" en este punto. O se compara con "1 \ n" o mueve la línea += después del if.

+0

¡No funciona! :( – FredVaz

+0

¿Usted intentó un programa de terminal para depurar el Arduino –

+0

El monitor Serie Sí, trato – FredVaz

1

Se podría, alternativamente, intente utilizar el Firmata library - es una forma mucho mejor de tener el firmware de serie en el Arduino y su gestión de .NET

creo, Firmata 2.0+ tiene soporte para I2C y servo control.

http://firmata.org/

Cuestiones relacionadas