Помогите плиз разобраться с получением команд через COM порт
- Войдите на сайт для отправки комментариев
Втр, 03/04/2018 - 23:34
Привет
Что то я никак в толк не возьму где ошибкаб помогите разобраться плиз.
Задача моя предельно проста - через 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! <---- Кроме того ещё и сообщение об ошибке
Где моя ошибка?
Вам просто нужно вывести в монитор то, что приходит. А следом за командой, скорее всего, приходит байт окончания строки. Во он Вам фейлы и высвечивает.
а тут-то что непнятного?
"111" - это три символа '1'подряд, что не так?
Хочу добится того чтобы команда читалась вся целиком. иными словами команда "111" не должна восприниматься как три команды "1"
Хочу добится того чтобы команда читалась вся целиком. иными словами команда "111" не должна восприниматься как три команды "1"
ну тогда не надо хватать единичный символ и сравнивать его с командой, как это делается у вас в коде
ну это мне частично помогло. погуглил. теперь я умею читать число с помощью 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();ну это мне частично помогло. погуглил. теперь я умею читать число с помощью Serial.parseInt() вместо Serial.read()
Это меня избавило от повторно выполняющейся команды.
но от довеска в виде Command failed! я пока не избавился
А зачем Вы вообще пишете на форум, если не читаете ответов?
Что делать, Вам написали уже в первом сообщении.
andriano, а вот поставьте себя на мое место а затем сами сделайте вывод что я думаю про ваш коментарий. Ладно?
вот поставьте себя на мое место а затем сами сделайте вывод что я думаю про ваш коментарий.
вам лучше даже не знать. что мы думаем про ваш код и ваши вопросы :)
А Адриано прав - пытайтесь вникнуть в уже полученные ответы, прежде чем задавать новые вопросы.
Если у кого то нет желания помочь конкретным советом и он считает себя слишком умным и оскорбляется вопросами новичков, то пожалуйста проходите мимо, не стоит здесь ничего писать, это не принесет пользы никому, и вас не украсит.
Если бы я знал как избавится от символа перевода строки, то я бы так и сделал, и не стал бы спрашивать. Но я не знаю. Я погуглил и пришел к выводу что
Serial.flush();должно "слить" всё лишнее. Но по некоторой причине это не работает. Тематические форумы для того и существуют чтобы люди могли общаться и поднимать вопросы любого уровня.Serial.peek() делаете и... если там не '0' ... '9', то не вызываете Serial.parceInt(). Вот и всё.
Serial.flush();должно "слить" всё лишнее.Так flush() сливает буфер передачи,разумеется Ардуины, а не компьютера передающего Ардуине. Да и завязывайте с травой.
Если у кого то нет желания помочь конкретным советом и он считает себя слишком умным и оскорбляется вопросами новичков, то пожалуйста проходите мимо, не стоит здесь ничего писать, это не принесет пользы никому, и вас не украсит.
Если бы я знал как избавится от символа перевода строки, то я бы так и сделал, и не стал бы спрашивать. Но я не знаю. Я погуглил и пришел к выводу что
Serial.flush();должно "слить" всё лишнее. Но по некоторой причине это не работает. Тематические форумы для того и существуют чтобы люди могли общаться и поднимать вопросы любого уровня.Если Вы хотите помощи, а не быть посланым нах, то не стоит учить всяких взрослых дядей как им вести себя в той, или иной ситуации. Это так, в общем.
А по сабжу, если команда в каждой передаваемой строке должна быть, то в крайнем коде , после
COM_commandCode =Serial.parseInt();вставьте сточку
while( Serial.available()) Serial.read();
Это как раз очистит весь принимаемый буфер.
вставьте сточку
while( Serial.available()) Serial.read();
Это как раз очистит весь принимаемый буфер.
ага, а заодно "очистит" все последующие команды, посланные подряд вслед за первой - и мы получим новый водопад вопросов и обвинений в гулме и нежелании помочь.
ага, а заодно "очистит" все последующие команды, посланные подряд вслед за первой - и мы получим новый водопад вопросов и обвинений в гулме и нежелании помочь.
Народ, че флудим? :) У человека была проблема с нулевым байтом, я предложил как ее решить. Какие вопросы? Ща начнем фантазировать на тему как организована передача команд, формат команд, и т.д.
И кстати, почитайте как работает
Serial.parseInt();Функция parseInt() является наследником вспомогательного класса Stream. https://doc.arduino.ua/ru/prog/Serial/ParseInt
Это самое важное что надо знать . Serial это уже издержки.