2011-11-27 8 views
9

Tôi đã phát triển một ứng dụng gửi dữ liệu cho một Arduino bằng cổng nối tiếp, nhưng tôi không thể hiểu làm thế nào tôi có thể nhận được nó trên Arduino. Tôi gửi một chuỗi bởi cổng nối tiếp cho Arduino và Arduino nhận nó, nhưng nó không hoạt động trong mã của tôi (trên Arduino, tôi nhận được một byte tại một thời điểm).Làm cách nào để nhận dữ liệu từ PC sang Arduino?

Cập nhật: nó làm việc;)

Mã trong C# sẽ gửi dữ liệu:

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

Mã Arduino:

Tôi có Cập nhật Bộ luật

#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

có thể là một nơi tốt hơn để đặt câu hỏi: http: //electronics.stackexchange.com/ – vikingosegundo

Trả lời

3

Một số điều mà làm cho tăng lông mày của tôi:

serialPort1.Write("1"); 

này sẽ viết chính xác một byte, các 1, nhưng không xuống dòng và không có đuôi NUL-Byte. Nhưng ở đây bạn đang chờ đợi một byte NUL thêm:

if (incomingByte == '\0') { 

Bạn nên sử dụng WriteLine thay vì Write, và chờ cho \n thay vì \0.

này có hai tác dụng phụ:

Đầu tiên: Nếu có một số đệm cấu hình, sau đó có một cơ hội nào đó, hơn một dòng mới sẽ đẩy dữ liệu đệm cho Arduino. Để chắc chắn bạn phải tìm hiểu các tài liệu tại MSDN.

Thứ hai: Điều này làm cho giao thức của bạn chỉ ASCII. Điều này rất quan trọng để gỡ lỗi dễ dàng hơn. Sau đó bạn có thể sử dụng một đồng bằng chương trình terminal như hyperterm hoặc HTerm (chỉnh sửa) hoặc thậm chí nền giao tiếp Serial Monitor trong Arduino IDE chính nó (chỉnh sửa) để gỡ lỗi của bạn Arduino-Code mà không lo lắng về lỗi trong mã C#. Và khi mã Arduino hoạt động, bạn có thể tập trung vào phần C#. Chia và vĩnh cửu.

Edit: Một điều tôi nhận thấy sau khi đào ra Arduino của riêng tôi:

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

này tất nhiên sẽ không hoạt động như mong đợi, bởi vì chuỗi sẽ chứa "1 \ n" vào thời điểm này. Hoặc bạn so sánh với "1 \ n" hoặc di chuyển dòng += sau số if.

+0

Không hoạt động! : ( – FredVaz

+0

Bạn đã thử một chương trình Terminal để gỡ lỗi Arduino? –

+0

Màn hình nối tiếp? Có, tôi thử. – FredVaz

1

Hoặc bạn có thể thử sử dụng các Firmata library - đó là một cách tốt hơn của việc có firmware chuẩn trên Arduino và quản lý nó từ .net

Tôi tin rằng, Firmata 2.0+ đã hỗ trợ cho I2C và điều khiển servo.

http://firmata.org/