Помогите плиз разобраться с получением команд через COM порт

bigfoot99
Offline
Зарегистрирован: 03.02.2018

Привет

Что то я никак в толк не возьму где ошибкаб помогите разобраться плиз.

Задача моя предельно проста - через COM порт получить команду всю целиком от начала до 'Enter'(перевод строки) и проверить соответствует ли команда известному коду команд. Если да - то выполняем команду а если не соответствует то сообщаем об ошибке.

Код:

void loop() 
{
  if (Serial.available())
  {
    COM_commandCode = Serial.read()- '0';
    if (COM_commandCode == 1)
    {
      Serial.print ("CurrentTemp: 22");
    }
    else 
    {
      Serial.println("Command failed!");
    }
    Serial.flush();
  }
}

Но вопреки ожиданиям в мониторе порта получаю следующее:

<Отправляю '1'>
CurrentTemp: 22   <---- Это ожидаемый результат выполнения команды '1'
Command failed!   <---- Но почему то в довесок получаю сообщение об ошибке
 
 
<Отправляю '111'>
CurrentTemp: 22   <---- Вместо сообщения об ошибке я получаю три раза выполненную команду '1'
CurrentTemp: 22
CurrentTemp: 22
Command failed!   <---- Кроме того ещё и сообщение об ошибке
 

Где моя ошибка?

5N62V
Offline
Зарегистрирован: 25.02.2016

Вам просто нужно вывести в монитор то, что приходит. А следом за командой, скорее всего, приходит байт окончания строки. Во он Вам фейлы и высвечивает.

b707
Offline
Зарегистрирован: 26.05.2017

bigfoot99 пишет:

<Отправляю '111'>
CurrentTemp: 22   <---- Вместо сообщения об ошибке я получаю три раза выполненную команду '1'

а тут-то что непнятного?

"111" - это три символа '1'подряд, что не так?

bigfoot99
Offline
Зарегистрирован: 03.02.2018

Хочу добится того чтобы команда читалась вся целиком.  иными словами команда "111" не должна восприниматься как три команды "1"

b707
Offline
Зарегистрирован: 26.05.2017

bigfoot99 пишет:

Хочу добится того чтобы команда читалась вся целиком.  иными словами команда "111" не должна восприниматься как три команды "1"

ну тогда не надо хватать единичный символ и сравнивать его с командой, как это делается у вас в коде

bigfoot99
Offline
Зарегистрирован: 03.02.2018

ну это мне частично помогло. погуглил.  теперь я умею читать число с помощью Serial.parseInt() вместо Serial.read()

Это меня избавило от повторно выполняющейся команды.

но от довеска в виде Command failed! я пока не избавился

if (Serial.available())
  {
    COM_commandCode = Serial.parseInt();
    if (COM_commandCode == 1)
    {
      Serial.print ("CurrentTemp: 22");
    }
    else 
    {
      Serial.println("Command failed!");
    }
    Serial.flush();

 

<Отправляю '1'>
CurrentTemp: 22   <---- Это ожидаемый результат выполнения команды '1'
Command failed!   <---- Но почему то в довесок получаю сообщение об ошибке

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bigfoot99 пишет:

ну это мне частично помогло. погуглил.  теперь я умею читать число с помощью Serial.parseInt() вместо Serial.read()

Это меня избавило от повторно выполняющейся команды.

но от довеска в виде Command failed! я пока не избавился

А зачем Вы вообще пишете на форум, если не читаете ответов?

Что делать, Вам написали уже в первом сообщении.

bigfoot99
Offline
Зарегистрирован: 03.02.2018

andriano, а вот поставьте себя на мое место а затем сами сделайте вывод что я думаю про ваш коментарий. Ладно?

b707
Offline
Зарегистрирован: 26.05.2017

bigfoot99 пишет:

 вот поставьте себя на мое место а затем сами сделайте вывод что я думаю про ваш коментарий.

вам лучше даже не знать. что мы думаем про ваш код и ваши вопросы :)

А Адриано прав - пытайтесь вникнуть в уже полученные ответы, прежде чем задавать новые вопросы.

bigfoot99
Offline
Зарегистрирован: 03.02.2018

Если у кого то нет желания помочь конкретным советом и он считает себя слишком умным и оскорбляется вопросами новичков, то пожалуйста проходите мимо, не стоит здесь ничего писать, это не принесет пользы никому, и вас не украсит.

Если бы я знал как избавится от символа перевода строки, то я бы так и сделал, и не стал бы спрашивать.  Но я не знаю.  Я погуглил и пришел к выводу что Serial.flush(); должно "слить" всё лишнее. Но по некоторой причине это не работает.  Тематические форумы для того и существуют чтобы люди могли общаться и поднимать вопросы любого уровня.

sadman41
Offline
Зарегистрирован: 19.10.2016

Serial.peek() делаете  и... если там не '0' ... '9', то не вызываете Serial.parceInt(). Вот и всё. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

bigfoot99 пишет:
Я погуглил и пришел к выводу что Serial.flush(); должно "слить" всё лишнее.
Вы или глючный Гугл юзаете, или читаете после тяжелой травы. У Ардуины есть буфер передачи и буфер приема. 

Так flush() сливает буфер передачи,разумеется Ардуины, а не компьютера передающего Ардуине. Да и завязывайте с травой.

5N62V
Offline
Зарегистрирован: 25.02.2016

bigfoot99 пишет:

Если у кого то нет желания помочь конкретным советом и он считает себя слишком умным и оскорбляется вопросами новичков, то пожалуйста проходите мимо, не стоит здесь ничего писать, это не принесет пользы никому, и вас не украсит.

Если бы я знал как избавится от символа перевода строки, то я бы так и сделал, и не стал бы спрашивать.  Но я не знаю.  Я погуглил и пришел к выводу что Serial.flush(); должно "слить" всё лишнее. Но по некоторой причине это не работает.  Тематические форумы для того и существуют чтобы люди могли общаться и поднимать вопросы любого уровня.

Если Вы хотите помощи, а не быть посланым нах, то не стоит учить всяких взрослых дядей как им вести себя в той, или иной ситуации. Это так, в общем.

А по сабжу, если команда в каждой передаваемой строке должна быть, то в крайнем коде , после 

COM_commandCode = Serial.parseInt();

вставьте сточку 

while( Serial.available()) Serial.read();

Это как раз очистит весь принимаемый буфер.

b707
Offline
Зарегистрирован: 26.05.2017

5N62V пишет:

вставьте сточку 

while( Serial.available()) Serial.read();

Это как раз очистит весь принимаемый буфер.

ага, а заодно "очистит" все последующие команды, посланные подряд вслед за первой - и мы получим новый водопад вопросов и обвинений в гулме и нежелании помочь.

5N62V
Offline
Зарегистрирован: 25.02.2016

b707 пишет:

ага, а заодно "очистит" все последующие команды, посланные подряд вслед за первой - и мы получим новый водопад вопросов и обвинений в гулме и нежелании помочь.

Очистит только те, которые не являются int.  Разве не так?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

5N62V пишет:
Очистит только те, которые не являются int.  Разве не так?
Вот так и засыпался Штирлиц. 1)Serial принимает и отправляет только байты и только побайтно. 2) и отправляет не телепортацией , раз и все перешло, а медленно по очереди. Вы очистили все что пришло в Ардуину. А пока чистили, еще немножко в буфер накапало- накакало с ПК

5N62V
Offline
Зарегистрирован: 25.02.2016

Народ, че флудим? :) У человека была проблема с нулевым байтом, я предложил как ее решить. Какие вопросы? Ща начнем фантазировать на тему как организована передача команд, формат команд, и т.д. 

И кстати, почитайте как работает Serial.parseInt();

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Функция parseInt() является наследником вспомогательного класса Streamhttps://doc.arduino.ua/ru/prog/Serial/ParseInt

Это самое важное что надо знать . Serial это уже издержки.