2011-11-27 7 views
9

Opracowałem aplikację, która wysyła dane do Arduino przez port szeregowy, ale nie mogę zrozumieć, jak mogę ją odebrać na Arduino. Wysyłam ciąg przez port szeregowy dla Arduino i Arduino go odbiera, ale to nie działa w moim kodzie (na Arduino, otrzymuję bajt na raz).Jak mogę odbierać dane z komputera na Arduino?

Aktualizacja: to działa;)

Kod w C#, który wysyła dane:

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

Kod Arduino:

mam zaktualizować kod

#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

może lepszym miejscem do zadawania http: //electronics.stackexchange.com/ – vikingosegundo

Odpowiedz

3

Niektóre rzeczy, które sprawiają, że moje brwi podbicie:

serialPort1.Write("1"); 

to napisze dokładnie jeden bajt, tym 1, ale nie przełamane i brak spływu NUL-bajtowych. Ale tu czekasz na dodatkową NUL bajt:

if (incomingByte == '\0') { 

Należy użyć WriteLine zamiast Write i czekać na \n zamiast \0.

ten ma dwa skutki uboczne:

pierwszy: Jeśli istnieją pewne buforowanie skonfigurowany, to istnieje pewna szansa, niż nowej linii pchnie buforowane dane do Arduino. Aby mieć pewność, musisz przekopać się przez dokumenty na MSDN.

Po drugie: To powoduje, że twój protokół jest tylko ASCII. Jest to ważne dla łatwiejszego debugowania. Następnie można użyć zwykłego programu terminala jak Hyperterm lub HTerm (edycji) lub nawet Serial Monitor w Arduino samego IDE (edycji) do debugowania Arduino kod bez obawy o błędy w swojej kodu C#. A gdy działa kod Arduino, możesz skoncentrować się na części C#. Divide et impera.

Edit: Inną rzeczą, jaką zauważyłem po wykopaniu mój własny Arduino:

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

Będzie to oczywiście nie działać zgodnie z oczekiwaniami, ponieważ ciąg będzie zawierać „1 \ n” w tym momencie. Albo porównaj z "1 \ n" lub przenieś linię += po if.

+0

Nie działa! :( – FredVaz

+0

Czy próbowałeś programu terminalowego do debugowania Arduino? –

+0

Serial Monitor? Tak, próbuję. – FredVaz

1

Można ewentualnie spróbować użyć Firmata library - to znacznie lepszy sposób posiadania standardowego firmware na Arduino i kierowanie go z .net

wierzę, Firmata 2.0+ posiada wsparcie dla I2C i kontroli servo.

http://firmata.org/

Powiązane problemy