Отправка данных через Shell и через Монитор порта. В чем разница?

jmas
Offline
Зарегистрирован: 02.06.2013

Может кто ни будь сталкивался с похожей проблемой.

К ардуино прицеплен мотор через небольшую схемку реализующую реверс.

Набросал небольшой скетч, реализующий отправку Serial данных. Ардуино должно при получении w - включать дижение вперед, s - назад.

При открытом стандартном мониторе порта - все ок, данные можно отправить - мотор работает в стоответствии с логикой скетча.

Если я пытаюсь отправить данные через Shell консоль, используя

echo -en 'w' > /dev/ttyACM0

Ардуина мигает светодиодом RX и L, но ничего не делает.

Когда открываю монитор и пытаюсь отправить через Shell данные - мотор не работает, но пишет, что данные получил.

Отправляю данные через Монитор порта - мотор работает.

У меня вопрос: чем отличается отправка данных через Монитор порта и через Shell?

jmas
Offline
Зарегистрирован: 02.06.2013

jmas пишет:

Может кто ни будь сталкивался с похожей проблемой.

К ардуино прицеплен мотор через небольшую схемку реализующую реверс.

Набросал небольшой скетч, реализующий отправку Serial данных. Ардуино должно при получении w - включать дижение вперед, s - назад.

При открытом стандартном мониторе порта - все ок, данные можно отправить - мотор работает в стоответствии с логикой скетча.

Если я пытаюсь отправить данные через Shell консоль, используя

echo -en 'w' > /dev/ttyACM0

Ардуина мигает светодиодом RX и L, но ничего не делает.

Когда открываю монитор и пытаюсь отправить через Shell данные - мотор не работает, но пишет, что данные получил.

Отправляю данные через Монитор порта - мотор работает.

У меня вопрос: чем отличается отправка данных через Монитор порта и через Shell?

В итоге: работает только с открытым Монитором порта. В чем может быть проблема? Почему Монитор порта так влияет на конечный результат обработки данных ардуиной?

toc
Offline
Зарегистрирован: 09.02.2013

на какой скорости работает echo ?

и покажите ваш скетч.

Geronimo
Offline
Зарегистрирован: 06.05.2013

jmas пишет:

Если я пытаюсь отправить данные через Shell консоль, используя

echo -en 'w' > /dev/ttyACM0

У меня вопрос: чем отличается отправка данных через Монитор порта и через Shell?

 

Отличается тем, что монитор устанавливает скорость ком порта, ехо использует системные настройки.

Когда запускаешь монитор, он конфигурит порт, и ехо начинает работать на уже настроеном порту.

Укажи настройки порта, по умолчанию там не 9600 стоит

 

Вывод на экран текущих параметров:
    stty -F /dev/ttyS0 -a
    setserial -g /dev/ttyS0

Включение Hardware flow control (RTS/CTS):
    stty -F /dev/ttyS0 crtscts

Установка скорости порта:
    stty -F /dev/ttyS0 9600
Geronimo
Offline
Зарегистрирован: 06.05.2013
Настройка параметров последовательного порта в Gentoo Linux [исправить]
Исправляем (ели нужно) в файле ``/etc/init.d/serial''

   SETSERIAL="/sbin/setserial"
на
   SETSERIAL="/bin/setserial"

Конфигурация должна находиться в файле ``/etc/rc.d/config/serial''

Пример конфигурации:

root # cat /etc/rc.d/config/serial  
   #!/etc/init.d/serial
   # setup serial ports
   # setport(device, irq, port, args)

   setports()
   {
       setport ttyS2 19 0xa400 "baud_base 9600"
       setport ttyS3 19 0xa000 "baud_base 115200"
       setport ttyS4 18 0xbc00 "baud_base 115200"
       setport ttyS5 19 0xb800 "baud_base 115200"
   }

 

jmas
Offline
Зарегистрирован: 02.06.2013
int motorPin1 = 11;
int motorPin2 = 12;
int incomingByte = 0;
int motorState = 0;

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

void motorForward()
{
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
}

void motorBack()
{
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
}

void motorStop()
{
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
}

void loop()
{
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
     
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
    
    if (incomingByte == 119) {
      motorState = 1;
    } else if (incomingByte == 115) {
      motorState = 2;
    } else {
      motorState = 0;
    }
    
    Serial.flush();
  }
  
  switch (motorState)
  {
    case 0:
      motorStop();
      Serial.println("Stop");
      break;
    case 1:
      motorForward();
      Serial.println("Forward");
      break;
    case 2:
      motorBack();
      Serial.println("Back");
      break;
  }
}

Выставление порта на скорость 9600 ничего не дало. После закрытия терминала управление из консоли тоже перестает работать.

Спасибо за советы, но пока не получается работать с ардуиной без открытого Монитора порта через Shell. Есть еще идеи?

toc
Offline
Зарегистрирован: 09.02.2013

как называется ваша плата ардуино?

попробуйте подключиться к дуине программой putty.

>> Когда открываю монитор и пытаюсь отправить через Shell данные - мотор не работает, но пишет, что данные получил.

что конкретно тут получает ваша дуина?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Кроме скорости есть еще установки по кол-ву битов, стоп битов, четность, управление потоком, это тоже нужно проверить.