Передача данных по com-порту

roma28
Offline
Зарегистрирован: 21.03.2011

С компьютера на arduino передается два ascii символа: направление и скорость, arduino должен их считывать и обрабатывать, как лучше сделать.

 

Сейчас делаю так:

Arduino:
  if(Serial.available() > 0)
  {
    byte Speed = byte(Serial.read());
    byte Direction = byte(Serial.read());
    Serial.println(Direction, HEX);
    if(Direction == 0x7E)
    {
      motor.run(FORWARD);
    }
    else if(Direction == 0x7D)
    {
      motor.run(BACKWARD);
    }
    motor.setSpeed(Speed*2);
  }
Компьютер:
com.Write(Convert.ToChar(127));
com.Write(Convert.ToChar(0x7E));

 Этот вариант не работает, подскажите как сделать.

maksim
Offline
Зарегистрирован: 12.02.2012

А весь код можно?

roma28
Offline
Зарегистрирован: 21.03.2011

 компьютер или arduino?

maksim
Offline
Зарегистрирован: 12.02.2012

Ну для начала ардуну

roma28
Offline
Зарегистрирован: 21.03.2011

Вот код:

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available() > 0)
  {
    byte Speed = byte(Serial.read());
    byte Direction = byte(Serial.read());
    if(Direction == 0x7E)
    {
      motor.run(FORWARD);
    }
    else if(Direction == 0x7D)
    {
      motor.run(BACKWARD);
    }
    motor.setSpeed(Speed*2);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте так:

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available())
  {
    byte Speed = Serial.read();
    delay(5);
    byte Direction = Serial.read();
    if(Direction == 0x7E)
    {
      motor.run(FORWARD);
    }
    else if(Direction == 0x7D)
    {
      motor.run(BACKWARD);
    }
    motor.setSpeed(Speed*2);
  }
}

 

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

У меня вот так работает:

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  if(Serial.available())
  {
    byte Speed = Serial.read();   
    delay(5);
    byte Direction = Serial.read();
    
    Serial.print(Speed);
    Serial.print(Direction);
    Serial.print('\n');
    
    if(Direction == 102)
    {
      motor.run(FORWARD);
    }
    else if(Direction == 98)
    {
      motor.run(BACKWARD);
    }
    motor.setSpeed((Speed-48)*28);
  }
}

Шлю в сириал "9f" - двигатель крутится с максимальной силой в одну сторону,  шлю "5" - крутится в туже сторону в полсилы, шлю "5b" - крутится в обратную сторону в полсилы, "0" - останавливается и т.д.

roma28
Offline
Зарегистрирован: 21.03.2011

 Я сделал вот так:

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if(Serial.available() > 1)
  {
    byte Speed = byte(Serial.read());
    byte Direction = byte(Serial.read());
    Serial.flush();
    if(Direction == 0x66)
    {
      motor.run(FORWARD);
    }
    else if(Direction == 0x62)
    {
      motor.run(BACKWARD);
    }
    motor.setSpeed(Speed*2);
  }
}

Вроде все работает.

maksim
Offline
Зарегистрирован: 12.02.2012

Да, так тоже можно.

roma28
Offline
Зарегистрирован: 21.03.2011

 Буду делать с двумя моторами, потом отпишусь.