Как я могу получить данные с ПК на Arduino? - PullRequest
9 голосов
/ 27 ноября 2011

Я разработал приложение, которое отправляет данные для Arduino через последовательный порт, но я не могу понять, как я могу получить их на Arduino. Я посылаю строку через последовательный порт для Arduino, и Arduino получает ее, но она не работает в моем коде (на Arduino я получаю байт за раз).

Обновление: работает;)

Код в C #, который отправляет данные:

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

Код Arduino:

Я обновил код

#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 = "";
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Некоторые вещи, которые заставляют мою бровь подняться:

serialPort1.Write("1");

Это напишет точно один байт, 1, но без новой строки и без завершающего NUL-байта.Но здесь вы ожидаете дополнительный байт NUL:

if (incomingByte == '\0') {

Вы должны использовать WriteLine вместо Write и ждать \n вместо \0.

Это имеет два побочных эффекта:

Первое: Если настроена некоторая буферизация, то есть определенный шанс, что новая строка будет выдвигать буферизованные данные вАрдуино.Чтобы быть уверенным, вам нужно просмотреть документы в MSDN.

Второе: это делает ваш протокол только ASCII.Это важно для облегчения отладки.Затем вы можете использовать обычную терминальную программу , такую ​​как Hyperterm или HTerm ( edit ) или даже Serial Monitor в самой IDE Arduino ( edit ) для отладки вашего Arduino-Код, не беспокоясь об ошибках в вашем коде C #.И когда код Arduino работает, вы можете сосредоточиться на части C #.Divide et impera.

Редактировать: Еще одна вещь, которую я заметил после раскопок моего собственного Arduino:

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

Это, конечно, не будет работать, как ожидалось, потому что строкабудет содержать "1 \ n" в этой точке.Либо вы сравниваете с «1 \ n», либо перемещаете строку += после if.

1 голос
/ 07 июля 2012

Вы также можете попробовать использовать библиотеку Firmata - это намного лучший способ иметь стандартную прошивку на Arduino и управлять ею из .net

Полагаю, Firmata 2.0+ поддерживает I2C и сервоуправление.

http://firmata.org/

...