2011-11-27 18 views
9

Ho sviluppato un'applicazione che invia dati per un Arduino tramite la porta seriale, ma non riesco a capire come posso riceverlo su Arduino. Invio una stringa dalla porta seriale per Arduino e Arduino lo riceve, ma non funziona nel mio codice (su Arduino, ricevo un byte alla volta).Come posso ricevere dati da un PC su un Arduino?

Aggiornamento: si sta lavorando;)

Il codice in C# che invia i dati:

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. 
    } 
} 

Il codice di Arduino:

ho aggiornare il codice

#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

forse un posto migliore per chiedere: http: //electronics.stackexchange.it/ – vikingosegundo

risposta

3

Alcune cose che rendono il mio sopracciglio rilancio:

serialPort1.Write("1"); 

Questo scriveranno esattamente un byte, il 1, ma nessun ritorno a capo e nessun finale NUL-Byte. Ma qui sono in attesa di un ulteriore byte NUL:

if (incomingByte == '\0') { 

Si consiglia di utilizzare WriteLine invece di Write, e attendere \n invece di \0.

Questo ha due effetti collaterali:

Prime: Se c'è qualche tamponamento progettato, quindi c'è una certa probabilità, di una nuova linea di spingerà i dati nel buffer al Arduino. Per essere sicuro di dover scavare attraverso i documenti su MSDN.

Secondo: ciò rende il protocollo solo ASCII. Questo è importante per facilitare il debug. È quindi possibile utilizzare un semplice programma di terminale come Hyperterm o HTerm (modifica) o anche il Serial Monitor nella Arduino IDE stesso (modifica) per eseguire il debug Arduino-Code, senza preoccuparsi di bug nel codice C#. E quando il codice Arduino funziona, puoi concentrarti sulla parte C#. Divide et impera.

Edit: Un'altra cosa che ho notato dopo aver scavato la mia Arduino:

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

Ovviamente questo non funziona come previsto, perché la stringa conterrà "1 \ n" a questo punto. O si confronta con "1 \ n" o si sposta la riga += dopo lo if.

+0

Non lavorare! :( – FredVaz

+0

Hai provato un programma terminale per il debug di Arduino? –

+0

Il monitor seriale? Sì, ci provo. – FredVaz

1

Si potrebbe in alternativa, provare a utilizzare il Firmata library - è un modo molto migliore di avere il firmware standard sul Arduino e la gestione da .net

Credo, Firmata 2.0 + ha il supporto per I2C e servocomando.

http://firmata.org/

Problemi correlati