serial принятое слово написано большими буквами или маленькими! Как отличить?

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

Вопрос прост! Сериал принимает слово, но не знает большими оно буквами написано или маленькими! Крайне важно! Помогите ! 

}
void loop(){
read_serial();


}
void read_serial() {
if (Serial.available() > 0) {
char ByteRead=Serial.read();  
if (ByteRead==13) {  //возврат каретки
analyzer();   //передача данных на обработку
bufer="";
}  //освобождение буфера
else {
//накопление данных в буфер
if(ByteRead!=10)bufer=bufer+char(ByteRead); // символ "новая строка" \n, нам в буффере не нужен
}  
}
}
void analyzer() {

if   (bufer=="off") {    КАК ТУТ УЗНАТЬ БОЛЬШИМИ БУКВАМИ ИЛИ МАЛЕНЬКИМИ СЛОВО НАПИСАНО ? ПОМОГИТЕ ! ОЧЕНЬ ВАЖНО! }

и после того как узнает еще как узнать есть ли в слове буква 'B' на конце !!! все спасибо!  

 

 

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

Я вам больше скажу - он даже не отличает букв от цифр. Вообще.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, а скажите - в какой кодировке передается текст у Вас на серийном порту?

Если Вы это знаете, то анализируете буквы прямо на приеме (16 строка) на предмет вхождение в диапазон заглавных букв и считаете их число. Если оно равно количеству букв в слове - то значит все заглавные, иначе - не все... Букву перед последней анализируете на равенство "В". Или Вам надо программу написать - так это не сюда. 

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

Если речь не о русских буквах, то чем не устраивают стандартные макросы?

if (isupper(ByteREad)) {
    // прописная буква
} else if (islower(ByteREad)) {
    //  строчная буква
} else {
    // не буква
}

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

ЕвгенийП Спасибо бошльшое ! Заработало! Как же я люблю ваши советы! Как последнюю букву в слове "видеть" ? Спасибо всем за все советы! 

char слово последнюю букву у char слова как найти 

Кодировка ASCII у ардуины, на английском слова. Последнюю букву как "отсчитать" не знаю 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Если речь не о русских буквах, то чем не устраивают стандартные макросы?

if (isupper(ByteREad)) {
    // прописная буква
} else if (islower(ByteREad)) {
    //  строчная буква
} else {
    // не буква
}

isupper все сделал, но куда то тащит из слова букву! например слово которое он "посмотрел" стало меньшим, букву "утаскивает" этот код, было SLOVO, стало SLO, он отцапал себе 2 буквы! 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

MYFRIEND пишет:

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

Если речь не о русских буквах, то чем не устраивают стандартные макросы?

if (isupper(ByteREad)) {
    // прописная буква
} else if (islower(ByteREad)) {
    //  строчная буква
} else {
    // не буква
}

isupper все сделал, но куда то тащит из слова букву! например слово которое он "посмотрел" стало меньшим, букву "утаскивает" этот код, было SLOVO, стало SLO, он отцапал себе 2 буквы! Работает по принципу почты, когда посылка шла через их пункт, и стала другой. 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

как то так, вообщем из слова исчезли буквы. 

Green
Онлайн
Зарегистрирован: 01.10.2015

А ЕвгенийП маленький баг встроил. Специально для тренировки.)

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

Ну пример кода с исчазющей буквой давайте, только покороче :)

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Ну пример кода с исчазющей буквой давайте, только покороче :)

void loop(){
read_serial();
}
void read_serial() {
if (Serial.available() > 0) {
char ByteRead=Serial.read(); 
if (ByteRead==13) { 
 
 
  //возврат каретки
analyzer();   //передача данных на обработку
bufer="";
}  //освобождение буфера
else {
Serial.println(ByteRead);  
//накопление данных в буфер
if(ByteRead!=10)bufer=bufer+char(ByteRead); // символ "новая строка" \n, нам в буффере не нужен

//определение большая или небольшая буква 
if (isupper(bufer)) { //ЕСЛИ СЛОВО БОЛЬШИМИ БУКВАМИ
strip.setPixelColor(87, strip.Color(0, 0, 255));
  strip.show();
} 
else if (islower(bufer)) {//если слово маленькими буквами 
strip.setPixelColor(87, strip.Color(255, 0,0 ));
strip.show(); 
}  
else {//если цифры и т.д. 
  strip.setPixelColor(87, strip.Color(0, 255,0 ));
  strip.show(); 
}

}  
}
}
void analyzer() {
  
  
if   (bufer=="SLOVO") { strip.setPixelColor(48, strip.Color(255, 0, 0));
  strip.show(); 
  // Ждем 500 мс. 
    } 

нижняя строчка не может увидеть в буфере SLOVO и не включает светодиод, если убрать определение большая или маленькая буква, начинает находить SLOVO, выведя в в SERIALPRINT происходящее 

вот что остается от SLOVO 

S

L

O

V

в  коде пробовал и ByteRead и bufer 

вот, одну букву прихватила себе функция, нужно что бы отдала назад  

причём забирает после 4х букв все буквы себе, даже если написать SLOVO12345 оставит  SLOV забрав себе всё 

а слова из 4х букв и из 3х букв не забирает, !!! оставляет!!! 

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

Вот, знаете, я верю, что Вы не специально издеваетесь, а просто из-за непонимания процесса. Но, ребята, как же задолбали! Ну, приводите Вы ПОЛНЫЕ скетчи. ПОЛНЫЕ! Которые можно просто запустить и посмотреть. Вот что мне делать с Вашим куском? Дополнять его до состояния в котором он скомпилируется? Так я могу дополнить совсем не так, как у Вас. И толку?

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Вот, знаете, я верю, что Вы не специально издеваетесь, а просто из-за непонимания процесса. Но, ребята, как же задолбали! Ну, приводите Вы ПОЛНЫЕ скетчи. ПОЛНЫЕ! Которые можно просто запустить и посмотреть. Вот что мне делать с Вашим куском? Дополнять его до состояния в котором он скомпилируется? Так я могу дополнить совсем не так, как у Вас. И толку?

#include "Adafruit_NeoPixel.h" 
#define LED_COUNT 88 
#define LED_PIN 3 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); 
String bufer="";

void setup(){
  strip.begin(); 
  strip.setBrightness(30);
Serial.begin(115200);

}
void loop(){
read_serial();
}
void read_serial() {
if (Serial.available() > 0) {
char ByteRead=Serial.read(); 
if (ByteRead==13) { 
 
 
  //возврат каретки
analyzer();   //передача данных на обработку
bufer="";
}  //освобождение буфера
else {
Serial.println(ByteRead);  
//накопление данных в буфер
if(ByteRead!=10)bufer=bufer+char(ByteRead); // символ "новая строка" \n, нам в буффере не нужен

//определение большая или небольшая буква 
if (isupper(ByteRead)) { //ЕСЛИ СЛОВО БОЛЬШИМИ БУКВАМИ
strip.setPixelColor(87, strip.Color(0, 0, 255));
  strip.show();
} 
else if (islower(ByteRead)) {//если слово маленькими буквами 
strip.setPixelColor(87, strip.Color(255, 0,0 ));
strip.show(); 
}  
else {//если цифры и т.д. 
  strip.setPixelColor(87, strip.Color(0, 255,0 ));
  strip.show(); 
}

}  
}
}
void analyzer() {
  
  
if   (bufer=="SLOV") { strip.setPixelColor(48, strip.Color(255, 0, 0));
  strip.show(); 
  // Ждем 500 мс. 
    } 
else if   (bufer=="SLOVO") { strip.setPixelColor(48, strip.Color(0, 0, 255));
  strip.show(); 
  // Ждем 500 мс. 
    } 
} 

SLOV включает лампочку а SLOVO не включает буквы отгрызают все что больше 4х букв

 

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

Так, ну Вот ещё раз, я же просил, "чтобы можно было запустить и посмотреть". У Вас проблемы со строкой, ну и нафига Вы мне Adafruit_NeoPixel суёте? Как я его запускать-то буду?

Вы можете всё ненужное убрать, а оставить только рабор строки с печатью в Serial и всё?

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Так, ну Вот ещё раз, я же просил, "чтобы можно было запустить и посмотреть". У Вас проблемы со строкой, ну и нафига Вы мне Adafruit_NeoPixel суёте? Как я его запускать-то буду?

Вы можете всё ненужное убрать, а оставить только рабор строки с печатью в Serial и всё?

 

if(ByteRead!=10)bufer=bufer+char(ByteRead);
 
если убрать определение какая буква, то вот этот код работает с любой длины словом
 
  
if   (bufer=="SLOV") { strip.setPixelColor(48, strip.Color(255, 0, 0));
  strip.show(); 
 
а если так 
if(ByteRead!=10)bufer=bufer+char(ByteRead);
то после определений к низу доходит только 4 буквы, остальные "отбирают" 
//определение большая или небольшая буква 
if (isupper(ByteRead)) { //ЕСЛИ СЛОВО БОЛЬШИМИ БУКВАМИ
strip.setPixelColor(87, strip.Color(0, 0, 255));
  strip.show();
else if (islower(ByteRead)) {//если слово маленькими буквами 
strip.setPixelColor(87, strip.Color(255, 0,0 ));
strip.show(); 
}  
else {//если цифры и т.д. 
  strip.setPixelColor(87, strip.Color(0, 255,0 ));
  strip.show(); 
}
 
}  
}
}
void analyzer() {
  
  
if   (bufer=="SLOV") { strip.setPixelColor(48, strip.Color(255, 0, 0));
  strip.show(); 
 
    } 
else if   (bufer=="SLOVO") { strip.setPixelColor(48, strip.Color(0, 0, 255));
  strip.show(); 
 
    } 
 
это и есть весь код, там больше ничего нет только эта строка if(ByteRead!=10)bufer=bufer+char(ByteRead); 
и ваша функция, но срезает оставляя 4 буквы, в любом месте вставив Serial.println(ByteRead);  показывает, что там не загорелись лампочки из за пропажи букв, если ctrl x вырезать часть кода, определяющего какие буквы, перестают пропадать, искомая строчка и есть код "обрезания"
 
если вставляю в код вашу строчку, она то что ищем скорее всего, начинается "обрезание", если не делать  isupper то обрезание никто больше не делает  
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Послушайте меня внимательно.

1. функции сравнения (isupper, islower, isalpha и т.д.) ничего не образеют. Они вообще ничего не делаютс с символом - это просто сравнение.

2. Если Вы хотите, чтобы я разбирался с Вашим кодом, сделайте так, чтобы я мог его запустить. Т.е. уберите всё связанное с NeoPixel, отсавьте только работу с сериалом. И опубликуйте его в нормально, компилируемеом виде, чтобы я мог запустить и увидеть проблему.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Послушайте меня внимательно.

1. функции сравнения (isupper, islower, isalpha и т.д.) ничего не образеют. Они вообще ничего не делаютс с символом - это просто сравнение.

2. Если Вы хотите, чтобы я разбирался с Вашим кодом, сделайте так, чтобы я мог его запустить. Т.е. уберите всё связанное с NeoPixel, отсавьте только работу с сериалом. И опубликуйте его в нормально, компилируемеом виде, чтобы я мог запустить и увидеть проблему.

удалил все лишнее, компилируется, вроде ничего не менял, но программа стала вас слушаться 

String bufer="";

void setup(){
Serial.begin(115200);
Serial.println("start success");
}

void loop(){
read_serial();
}

void read_serial() {
if (Serial.available() > 0) {
char ByteRead=Serial.read(); 

if (ByteRead==13) { 
analyzer();  
bufer="";
} 

else {
//Serial.println(ByteRead);  
//накопление данных в буфер
if(ByteRead!=10)bufer=bufer+char(ByteRead); 

if (isupper(ByteRead)) { //ЕСЛИ СЛОВО БОЛЬШИМИ БУКВАМИ
if   (bufer=="SLOVO") {
 Serial.println("URA RABOTAET !!!");
 }  
//Serial.println("BOLSHIE BUKVY");
} 
else if (islower(ByteRead)) 
{
if   (bufer=="dlinnoeslovo") {
 Serial.println("ura rabotaet  !!!");
 }  
  
Serial.println("malenkiye bykvy"); 

} //если слово маленькими буквами 
else { 
Serial.println("drugie simvoly"); } //если цифры и т.д. 


}  
}
}

void analyzer() 
{

}     
  
  
     
 

 

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

Вывод на страйп с адресными светодиодами блокирует прерывания. Все, что прилетело во время этого вывода на аппаратный UART, будет прогнорировано и спущенно в null.

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

MYFRIEND пишет:
но программа стала вас слушаться
Ну, значит, islower / isupper не при делах, что и требовалось показать.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Послушайте меня внимательно.

1. функции сравнения (isupper, islower, isalpha и т.д.) ничего не образеют. Они вообще ничего не делаютс с символом - это просто сравнение.

2. Если Вы хотите, чтобы я разбирался с Вашим кодом, сделайте так, чтобы я мог его запустить. Т.е. уберите всё связанное с NeoPixel, отсавьте только работу с сериалом. И опубликуйте его в нормально, компилируемеом виде, чтобы я мог запустить и увидеть проблему.

Спасибо большое вам! Вставил назад neopixel и сразу заработало, без обрезаний!   Не знаю как последнюю букву только определить B там или нет, пишет если slovo 5 раз "ura rabotaet  !!!""ura rabotaet  !!!""ura rabotaet  !!!""ura rabotaet  !!!""ura rabotaet  !!!" сколько букв столько пишет раз, нужно очень определить последнюю букву в кодировке ANSIII эта буква 66 B последняя буква будет ли B важно очень сделать. в слове.  

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

MYFRIEND пишет:
но программа стала вас слушаться
Ну, значит, islower / isupper не при делах, что и требовалось показать.

Буду вам должен! Помогу чем смогу. Низкий вам поклон. 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

длина слова так скорее всего unsigned int lastStringLength = txtMsg.length(); 

[Length(s)-1]

будет такое работать? 

 

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

Вы как-то смешиваете String и массив чаров. Но направление верное. Последний символ - это символ по адресу lingth-1

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

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

Вы как-то смешиваете String и массив чаров. Но направление верное. Последний символ - это символ по адресу lingth-1

спасибо большое! вот так работает, удалось знать длину любого слова, следовательно номер последнего символа любого слова 

  String stringOne = "Hello!";
  Serial.print(stringOne);
  Serial.print("<--- end of string. Length: ");
  Serial.println(stringOne.length());

 

lean_74
Offline
Зарегистрирован: 22.12.2015

Для ТС не помешает ознакомиться https://rsdn.org/article/cpp/cstr.xml

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

lean_74 пишет:

Для ТС не помешает ознакомиться https://rsdn.org/article/cpp/cstr.xml

спасибо большое! 

использовал lastIndexOf

сделал так, если в конце слова нет B то firstclosingbracket получает -1, что достаточно 

if   (bufer=="SLOVO") {
 Serial.println("URA RABOTAET !!!");

  String stringOne = "Hello!";
  Serial.print(stringOne);
  Serial.print("<--- end of string. Length: ");
  Serial.println(stringOne.length());
 stringOne = "SLOVOB";
  int firstClosingBracket = stringOne.lastIndexOf('B');//отсчет с конца 
 Serial.println(firstClosingBracket);

 }

но lastindexof не в конце а во всем слове находит букву если есть B, что он и должен делать, находит и возвращает цифрой на каком месте от 0 отсчет находится буква, которую ищет, но не в конце слова, попробую lenght, подойдет если все слова с B  на конце, не подойдет если B другом месте слова, просто сообщит что нашёл, а на конце другая может быть буква, скорее всего lenght -1 

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

charAt() не хочет работать, bufer.charAt(4) не отдает букву  

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

MYFRIEND пишет:

charAt() не хочет работать, bufer.charAt(4) не отдает букву  

Жадный, наерна.  Или ты плохо просишь. 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

DetSimen пишет:

MYFRIEND пишет:

charAt() не хочет работать, bufer.charAt(4) не отдает букву  

Жадный, наерна.  Или ты плохо просишь. 

ардуино не отображала слова оказалось, использовал стороннюю программу serail port pro, а ардуино криво все показывала  

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

полностью рабочий код добил! причина буфер формировался и пока формировался буфер последние буквы с каждого прилетающего символа составляли слово 

перенес код куда буфер сформирован сразу заработало последняя буква найдена chartat заработал изучайте кому нужно

String bufer="";

void setup(){
Serial.begin(115200);
Serial.println("start success");
}

void loop(){
read_serial();
}

void read_serial() {
if (Serial.available() > 0) {
char ByteRead=Serial.read(); 

if (ByteRead==13) { 
analyzer();  
bufer="";
} 

else {
//Serial.println(ByteRead);  
//накопление данных в буфер
if(ByteRead!=10)bufer=bufer+char(ByteRead); 

 

}  
}
}

void analyzer() 
{
//if   (bufer=="SLOVO") {

// Serial.println("URA RABOTAET!!!");

int cifra = bufer.length(); 
char mostSignificantDigit = bufer.charAt(cifra-1);
Serial.println(mostSignificantDigit);

//}//serial print ln 
  
}     
  
если в конце не сделать cifra-1 то спецсимвол конца строки выведет
ниже ардуино найдёт по коду 66 букву B в конце слова а не другую букву, и выполнит действие в { }  
void analyzer() 
{

int cifra = bufer.length(); 
char poslednyabykva = bufer.charAt(cifra-1);
if (poslednyabykva==66){  
Serial.println(poslednyabykva);
}

 

 

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

MYFRIEND пишет:

полностью рабочий код добил! причина буфер формировался и пока формировался буфер последние буквы с каждого прилетающего символа составляли слово 

https://www.youtube.com/watch?v=oUk8uXYk_6A&feature=youtu.be&t=350