Свойства последовательно порта

strelok12371
Offline
Зарегистрирован: 28.12.2020

Всем привет. На днях я решил заняться изучением свойств последовательно порта. Для интереса, решил взять такую задачу. В зависимости оттого, какое слово мы ввели в порт, мы на выводе должны получить то или иное значение переменной (для последующего использования в switch).
Но столкнулся с такой проблемой, что он не сразу считывает данные. Помогите сделать считывание моментальным.
Вот пример программы(пишу не с пк, поэтому заранее сори за недочёты по типу потери запяточек):

char importp = "import";
char exportp = "export";
char sleepp = "sleep";
int a = 0;

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

void loop(){
for(;;){
if(Serial.find(importp)) a=1;
else{
if(Serial.find(exportp)) a=2;
else{
if(Serial.find(sleepp)) a =3;
}}
if(a > 0) break;
}}

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

В данный момент проблема куска приведённого выше кода в том, что идёт конфликт в считывании. Т.е. если мы введём import, а в этот момент команда ищет hello, то ничего не произойдёт. Как обойти этот момент?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

strelok12371 пишет:
Как обойти этот момент?

Научиться программировать правильно

strelok12371
Offline
Зарегистрирован: 28.12.2020

Научите новичка)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС, ты бы по форуму полазил для начала, поискал бы информацию о том как это делается.

strelok12371
Offline
Зарегистрирован: 28.12.2020

Искал. Но найти не получилось

MaksVV
Offline
Зарегистрирован: 06.08.2015
strelok12371
Offline
Зарегистрирован: 28.12.2020

Можно поподробней, я немного нубик

MaksVV
Offline
Зарегистрирован: 06.08.2015

по ссылке скетч. Он обрабатывает команды прилетевшие по Serial соединению . Нужные команды пишете вверху скетча. Обработка команд происходит в функции runCommand(). смотрите там комментарии. Также после команды можно передавать переменные, примерно так  start:1256:58:89 . Количество переменных после двоеточия задается вверху скетча. 

strelok12371
Offline
Зарегистрирован: 28.12.2020

Спасибо. буду иметь ввиду

 

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

"Функция Serial.find() осуществляет чтение данных из последовательного буфера до тех пор, пока не будет найдена искомая строка заданной длины".

Работает только первый ее вызов, обнаруживший байт в буфере объекта Serial.

strelok12371
Offline
Зарегистрирован: 28.12.2020

на данный момент я пришел к такому коду:

String b = "";
String wtf[7];
int a;
char inChar = "/";
char importp ="import/";
char exportp ="export/";
 
void setup()
{
Serial.begin(9600);
}
 
void loop()
{
a = 0;
 
if(!Serial.available());
 
 b =  Serial.readStringUntil(inChar);
b = wtf[7];
 Serial.println(wtf[7]);
delay(10);
if( wtf[7] == importp) a = 1;
else{
  if (wtf[7] == exportp) a = 2;
}
 
delay(10);
 
if( a > 0) cmf;
 
}
 
void cmf(){
 switch(a){
  case 1: Serial.println("aaa");break;
 
  case 2: Serial.println("bbb");break;
}
 
 
 
Но он работает только до вывода wtf
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

strelok12371 пишет:
Помогите сделать считывание моментальным.
Ну, тут простая арифметика. Совсем мгновенным, естественно, сделать невозможно - любая операция требует времени на выполнение, но если учесть, что тактовая частота наиболее распространенных контроллеров Ардуино составляет 16000000 Гц, то можно считать, что один период тактовой частоты - это для контроллера и будет "моментально".

Дальше:

- в байте, передаваемом по последовательному порту 8 информационных и два служебных бита, итого - 10. Вы передаете до 6 символов-байт, т.е. всего нужно передать 60 бит, т.е. скорость передачи должна составить 16000000*60=960000000, т.е. в программе Вам надо написать:

Serial.begin(960000000);

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

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

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

strelok12371 пишет:

String wtf[7];

int a;
char inChar = "/";
char importp ="import/";
char exportp ="export/";
 
Во-первых, научитесь вставлять код, как положено.
А во-вторых, у Вас явно строка не помещается в буфер.
 
PS. А свойства последовательного порта прекрасно выясняются, исходя из обычного здравого смысла: как он может работать, а как - не может. Очевидно, что вопреки законам физики - не может. Отсюда выводятся и все его свойства.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

strelok12371 пишет:
пишу не с пк, поэтому заранее сори за недочёты по типу потери запяточек

А Вы напишите с чего надо, чтобы всё было на месте и код был бы вставлен с номерами строк. Заодно подравняйте код перед вставкой.

MaksVV
Offline
Зарегистрирован: 06.08.2015

strelok12371 пишет:
Но столкнулся с такой проблемой, что он не сразу считывает данные. Помогите сделать считывание моментальным. ......Т.е. если мы введём import, а в этот момент команда ищет hello, то ничего не произойдёт. Как обойти этот момент?

используя b =  Serial.readStringUntil(inchar);

вы так же можете иметь задержки по двум причинам

первая задержка не столь критична, потому что она не очень большая. Связана с тем, что эта функция читает из Serial все байты, имеющиеся в буфере Serial,  сразу  - за один присест, остальное находящееся в loop() пока функция читает эти байты  -  ждёт.  Но байты читаются довольно  быстро, поэтому задержка не очень чувствуется.

вторая вполне себе ощутимая  -  если скетч не получит искомого символа inchar, то данная функция при этом будет работать как delay  в течение своего таймаута, по умолчанию, по-моему 1 сек. т.е. все остальное будет простаивать 1 секунду. 

Поэтому мой вам совет. Читайте по одному байту из Serial  каждый проход loop(), пока не наткнетесь на символ маркер конца строки. Обычно это символ перевода строки: обозначается LF  или '\n' (код 0x0A) . Такой подход и  без задержек и не будет переполнять буфер Serial. Как сделать, я вам пример давал. Что там не понятно, спрашивайте. 

и разберитесь чем отличаются одиночные символы от строк. Чем отличается например "/" от '/'

написав char importp ="import/";  , вы пытаетесь одиночному символу присвоить строку символов. Так низя

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

коллеги, о каких задержках вообще речь? Или вы так ТС троолите?

У него же в каждой строчке кода - жуткая чушь...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Или вы так ТС троолите?

Думаю, троллят.

b707 пишет:

У него же в каждой строчке кода - жуткая чушь...

Похоже, я тут единственный, кто действительно не читает неправильно вставленный код :-(

MaksVV
Offline
Зарегистрирован: 06.08.2015
b707 пишет:
У него же в каждой строчке кода - жуткая чушь...
 
ну я как бы и по просьбе в нулевом посту отписал и начал по его косякам:
 
MaksVV пишет:
вы пытаетесь одиночному символу присвоить строку символов
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Похоже, я тут единственный, кто действительно не читает неправильно вставленный код :-(

Я и правильно-то вставленный не всегда читаю... ;))

strelok12371
Offline
Зарегистрирован: 28.12.2020

Хорошо