Как сформировать пакет?

bit
Offline
Зарегистрирован: 07.05.2012

Привет всем форумчаном помогите пожалуйста в написании кода.

 Суть кода такова , если приходит пакет с сериал порта 

подобного типа

 #4 символов # 20 символов # 35 символов #

то мы подставляем другой пакет сформированный в if (val   в хвост первого пакета

 #4 символов # 20 символов # 35 символов # #open#

и отправляем весь пакет в сериал

 Вот код попытки сформирования пакета, подскажите пожалуйста как его сформировать







byte val = 0, val2 = 0, prev_val = 0

int fadeValue = 0;

void setup(){
  
 
   
  
  
  
}

void loop(){
  
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = SiftIn8bit(dataPin, clockPin); //  читаем 8в входов 165
  val2 = SiftIn8bit(dataPin, clockPin); 
  


                       
                        
  if (val == B00000001 && val2 == B00000000) // Если первый бит 1 то
 
  {
      Формируем пакет (open)    //  #open#
      
  }
  
   if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то
 
  {
      Формируем пакет (closed);  //  #closed#
      
  }
  
  
}

byte SiftIn8bit(byte dataPin, byte clockPin){
  byte in8bit = 0;
  for(int i = 0; i < 8; i++){     // читаем по 8в       
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) in8bit |= 1<<i;
    else in8bit &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  }
  
  return in8bit;
  
}

А этот код должен читает то что приходит из сериал и подставлять хвост к первому пакету.

Тут у меня несколько проблем он не может прочитать символ #  да и подставляет он сформированный пакет с переда

 

String slovo;
boolean read_end = 0;

void setup()
{
  
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
    if(slovo.substring(0,3) == "#123#123#123#") // Если с сериал приходит пакет  #   #   #   #  то мы подставляем хвост #closed# к пакетуи отпровляем в сериал
    {
     Serial.print("#closed#") ;
    }
    
    
     if(slovo.substring(0,3) == "#123#123#123#")  // Если с сериал приходит пакет  #   #   #   #  то мы подставляем хвост #closed# к пакету и отпровляем в сериал
    {
     Serial.println("#closed#");
    }
    
     
    Serial.println(slovo);
    read_end = 0;
    slovo = "";
  }
}

 

Помогите пожалуйста новичку

bit
Offline
Зарегистрирован: 07.05.2012

Куда делась вкладка редактировать?

 В названия темы ошибочка небольшая не сформируем, а как сформировать?

maksim
Offline
Зарегистрирован: 12.02.2012

По нормальному обьясните что хотите.

bit
Offline
Зарегистрирован: 07.05.2012

 

Привет извиняюсь что так объясняю сейчас попытаюсь более подробней объяснить

bit
Offline
Зарегистрирован: 07.05.2012

 

Есть устройство которое посылает пакеты в формате NEX в мадам через TX

#15D23#5255637735R26252RRRW#552431526WWTFX763#

Я подключаю ардуино в цепь, то есть  беру сигнал с устройства TX и подключаю в ардуино RX и соответственно TX с ардуино идeт в модем RX

Суть кода такова когда приходит пакет  выше указного формата  к ним нужно цеплять хвост #open# каторый формируется в ардуино с кнопак

И отправлять в RX на модем

bit
Offline
Зарегистрирован: 07.05.2012

 

Данные которые приходят с устройства постоянна меняются,

Не меняется только количество знаков

#4 символов # 20 символов # 35 символов #

bit
Offline
Зарегистрирован: 07.05.2012

 

Я так думаю что  мы создаём переменную Val для считывания данных

И катко нужно создать формулу

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

step962
Offline
Зарегистрирован: 23.05.2011

bit пишет:

 

Данные которые приходят с устройства постоянна меняются,

Не меняется только количество знаков

#4 символов # 20 символов # 35 символов #

Вот вы наконец-то сделали формальное представление поступающего пакета.

Теперь попробуйте изобразить, как выглядит отправляемый пакет.

PS: А. нашел. Отправляемый пакет выглядит вот так:

 #4 символов # 20 символов # 35 символов # #open#

Теперь вопрос: если пришел пакет #15D23#5255637735R26252RRRW#552431526WWTFX763#, то отправляемый пакет должен выглядеть как #15D23#5255637735R26252RRRW#552431526WWTFX763# #open#.

Лучше друг под дружкой:
#15D23#5255637735R26252RRRW#552431526WWTFX763#
#15D23#5255637735R26252RRRW#552431526WWTFX763# #open#

Так или все же иначе?

И бога ради - не начинайте снова о рисунке обоев в вашей комнате. Обрисуйте только суть вопроса.

step962
Offline
Зарегистрирован: 23.05.2011

Еще вопрос: входящий пакет вы сами формируете или получаете из какого-либо чужого устройства?

Другими словами - может этот пакет выглядеть не так:
#15D23#5255637735R26252RRRW#552431526WWTFX763# а, например, так:
<15D23#5255637735R26252RRRW#552431526WWTFX763>

 

bit
Offline
Зарегистрирован: 07.05.2012

 

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

#15D23#5255637735R26252RRRW#552431526WWTFX763#

 не меняется только количество знаков между #

А исходящий пакет с ардуино должен быть с привязкой

 

#15D23#5255637735R26252RRRW#552431526WWTFX763# #open#

bit
Offline
Зарегистрирован: 07.05.2012

 

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

#15D23#5255637735R26252RRRW#552431526WWTFX763#open#

step962
Offline
Зарегистрирован: 23.05.2011

bit пишет:

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

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

Я правильно понял:

1) поступивший пакет никак не изменяется, просто к нему привязывается хвост #open# (ну или open#)

2) поступающий пакет формируете не вы, поэтому влияния на него оказать не можете и он будет начинаться и кончаться именно знаками #

Ответьте на эти вопросы четко - "да" или "нет". 

bit
Offline
Зарегистрирован: 07.05.2012

 

В этом коде хвост подставляется к приходящему пакету нооо

Если он такой же по содержанию, а нужно чтобы содержания не имело значении

 

 if(slovo.substring(0,50) == "#15D23#5255637735R26252RRRW#552431526WWTFX763#")  // Если с сериал приходит пакет  #   #   #   #  то мы подставляем хвост #closed# к пакету и отпровляем в сериал
    {
      
      
       Serial.print(slovo);
    read_end = 0;
    slovo = "";
    
    
     Serial.println("#Open#");

 

bit
Offline
Зарегистрирован: 07.05.2012

 

1) поступивший пакет никак не изменяется, просто к нему привязывается хвост #open# (ну или open#)

ДА

2) поступающий пакет формируете не вы, поэтому влияния на него оказать не можете и он будет начинаться и кончаться именно знаками #

ДА

bit
Offline
Зарегистрирован: 07.05.2012

 

Тут  вроде бы часть кода работает

void loop()
{
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
   
   if(slovo.substring(0,2) == "AT" ) // если есть принятый символ то делаем то что в скобках
    {
       Serial.println("AT");     //  отправляем в сериал
    
       }
   
    else if(slovo.substring(0,50) == slovo )   // если есть принятый символ с сериал делаем то что в скобках
    {
       Serial.print(slovo);       // отправляем принятый символ в сериал
    
      Serial.println("#OPEN#");  // подставляем хвост

          }
      read_end = 0;
     slovo = "";
    
    }

bit
Offline
Зарегистрирован: 07.05.2012

Но когда я пытаюсь прописать ещё одну сквозную команду то происходит вот что

 

  if(slovo.substring(0,2) == "AT" ) // если есть принятый символ то делаем то что в скобках
    {
       Serial.println("AT");     //  отправляем в сериал
    
       }
       
        if(slovo.substring(0,12) == "AT+CPIN=1234" ) // если есть принятый символ то делаем то что в скобках
    {
       Serial.println("AT+CPIN=123");     //  отправляем в сериал
    
       }
   
    else if(slovo.substring(0,50) == slovo )
    {
       Serial.print(slovo);
    
      Serial.println("#OPEN#");
        
      }
      read_end = 0;
     slovo = "";
    
     

То получается такая ерунда

 

Snubist
Offline
Зарегистрирован: 18.02.2013

а если так

void loop() {
  // put your main code here, to run repeatedly: 
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
   
   if(slovo.length() <60 || slovo.length() >60) // если принято меньше или больше 60 
    {
       Serial.println(slovo);     //  отправляем в сериал
    
    }
   
    else if(slovo.charAt(1) == "#"  && slovo.charAt(5) == "#" && slovo.charAt(25) == "#" && slovo.charAt(60) == "#")   // иначе если # на своих местах то
    {
       
      Serial.print(slovo + "#open#");       // отправляем в сериал дописав #open#
    
      

          }
      read_end = 0;
     slovo = "";
      
}

 

bit
Offline
Зарегистрирован: 07.05.2012

Сейчас попробую

bit
Offline
Зарегистрирован: 07.05.2012

Попробовал не компилируется 18 строка

Snubist
Offline
Зарегистрирован: 18.02.2013

А если ковычки заменить на одиночные

вместо slovo.charAt(1) == "#" поставить slovo.charAt(1) == '#' и т.д.

bit
Offline
Зарегистрирован: 07.05.2012

Поменял компил проходит  но программа не работает

void loop() {
  // put your main code here, to run repeatedly: 
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
   
   if(slovo.length() <13 || slovo.length() >13) // если принято меньше или больше 60 
    {
       Serial.println(slovo);     //  отправляем в сериал
    
    }
   
    else if(slovo.charAt(1) == '#'  && slovo.charAt(3) == '#' && slovo.charAt(3) == '#' && slovo.charAt(3) == '#')   // иначе если # на своих местах то
    {
       
      Serial.print(slovo+ "#OPEN#");       // отправляем в сериал дописав #open#
    
       

          }
      read_end = 0;
     slovo = "";
      
}
}

 

Отправляю в сериал  AT  возвращается тоже самое

Отправляю в сериал #123#123#123# нечего не приходит

Snubist
Offline
Зарегистрирован: 18.02.2013

а так


void loop() {
  // put your main code here, to run repeatedly: 
  
  // put your main code here, to run repeatedly: 
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
   
   if(slovo.length() <13 || slovo.length() >13) // если принято меньше или больше 60 
    {
       Serial.println(slovo);     //  отправляем в сериал
    
    }
   
    else if(slovo.charAt(1) == 35  && slovo.charAt(3) == 35)   // иначе если # на своих местах то
    {
       
      Serial.print(slovo+ "#OPEN#");       // отправляем в сериал дописав #open#
    
       

          }

    else 
    {
    Serial.println(slovo);  
    }
         read_end = 0;
     slovo = ""; 
   }
}
bit
Offline
Зарегистрирован: 07.05.2012

Я вот так сделал сейчас теперь текст #123#123#123#

отправляется но хвост не подставляется

if(slovo.length() <15 || slovo.length() >15) // если принято меньше или больше 60 
    {
       Serial.println(slovo);     //  отправляем в сериал
    
    }
   
    else if(slovo.charAt(1) == '#'  && slovo.charAt(4) == '#' && slovo.charAt(4) == '#' && slovo.charAt(4) == '#')   // иначе если # на своих местах то
    {
       
      Serial.print(slovo + "#OPEN#");       // отправляем в сериал дописав #open#
    
       

          }
      read_end = 0;
     slovo = "";
      

 

bit
Offline
Зарегистрирован: 07.05.2012

 

Сейчас попробую

bit
Offline
Зарегистрирован: 07.05.2012

 

Так отправляется в серил  но тоже хвост не подставляется

maksim
Offline
Зарегистрирован: 12.02.2012

Отправляем: #15D23#5255637735R26252RRRW#552431526WWTFX763# ,
получаем: 
#15D23#5255637735R26252RRRW#552431526WWTFX763#open#

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


void loop() {

  if(Serial.available())
  {
    char buffer[100] = "";
    byte ch = 0;
    while(Serial.available())
    {
      delay(2);
      buffer[ch] = Serial.read();
      ch++;   
    }
    buffer[ch] = 0;
    byte sharp = 0;
    for(byte i = 0; buffer[i] > 0; i++) if(buffer[i] == '#') sharp++;
    Serial.print(buffer);
    if(sharp == 4) Serial.println("open#");
    else Serial.println();
  }
}

 

Snubist
Offline
Зарегистрирован: 18.02.2013

тоже вначале думал буфер пробегать, но потом решил раз есть  .charAt, использовать его, но блин почемуто не работает

maksim
Offline
Зарегистрирован: 12.02.2012

open# дописывается любой входящей строке, в которой присутствуют четыре шарпа(#), другие строки возвращаются как есть.

mixail844
Offline
Зарегистрирован: 30.04.2012

а почему бы не испоьзовать функцию 







char * strcat ( char * destination, const char * source );?

проверяя сколько в destination знаков "#"? потом же легче работать,если пакет нужно куда то передать..



    byte sharp = 0;
    for(byte i = 0; buffer[i] > 0; i++) if(buffer[i] == '#') sharp++;
      if(sharp == 4) strcat(buffer,"open#");
    Serial.print(buffer);

 

maksim
Offline
Зарегистрирован: 12.02.2012

Конкретно в данном случае это бессмысленно.
Зачем константу перезаписывать в буфер и выводить, если можно просто сразу вывести эту константу не записывая в буфер.

bit
Offline
Зарегистрирован: 07.05.2012

 

Всё заработало большое спасибо

Теперь осталось разобраться с формированием хвоста

 

bit
Offline
Зарегистрирован: 07.05.2012

Не могу сообразить как сохранить open#  в slovo  что бы его прочитать в Serial

 

 

if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то
 
  {
       slovo open#
      
  }

 

if(sharp == 4) Serial.println("slovo");

 

maksim
Offline
Зарегистрирован: 12.02.2012

bit пишет:
Не могу сообразить как сохранить open#  в slovo  что бы его прочитать в Serial
#28

bit
Offline
Зарегистрирован: 07.05.2012

всё равно не понял

bit
Offline
Зарегистрирован: 07.05.2012
if (val == B00000011 && val2 == B00000000) //  Если нажаты две кнопки то мы выпотные действие
 
  {
        slovo   open#                         // сохраняем  open#  в slovo
      

 

 

if(sharp == 4) Serial.println("slovo");  // отпровляем в сериал то что сохронино в slovo

Подскажите как сохранения сделать?

 

mixail844
Offline
Зарегистрирован: 30.04.2012


if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то
 
  {
      strcpy(slovo,"open#")
  }
Serial.Print(slovo);

 присваивание строки строке происходит при помощи функции strcpy();
bit
Offline
Зарегистрирован: 07.05.2012

Чего та не получается

bit
Offline
Зарегистрирован: 07.05.2012

А вот так заработало

if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то
 
  {
      slovо  = "open#";
  }
Serial.Print(slovo);

 

Snubist
Offline
Зарегистрирован: 18.02.2013

А так?

Serial.Print(slovo+"OPEN#");

 

mixail844
Offline
Зарегистрирован: 30.04.2012

bit пишет:

Чего та не получается

не получаеться,потому что я забыл добавить ";" в конце строчки.а вы наверняка не исправили.

if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то
 
  {
      strcpy(slovo,"open#");
  }
Serial.Print(slovo);

 

maksim
Offline
Зарегистрирован: 12.02.2012

bit, так скажите, вы все также используете объект класса String.slovo или все таки массив символов char slovo[] ?

bit
Offline
Зарегистрирован: 07.05.2012

Сейчас подождите чего та я тут опять напутал

Сейчас допишу код целиком и выложу

bit
Offline
Зарегистрирован: 07.05.2012

Вот код вроде всё работает так как нужно

Если в сериал приходит пакет в # то  к нему цепляется хвост  сформированный  в зависимости от нажатой кнопки и оправляется в сериал   

 

void loop(){
  
  
   if(Serial.available())
  {
    char buffer[100] = "";
    byte ch = 0;
    while(Serial.available())
    {
      delay(2);
      buffer[ch] = Serial.read();
      ch++;   
    }
    buffer[ch] = 0;
    byte sharp = 0;
    for(byte i = 0; buffer[i] > 0; i++) if(buffer[i] == '#') sharp++;
    Serial.print(buffer);
    if(sharp == 4) Serial.println(slovo);
    else Serial.println();
  }
  
   digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = SiftIn8bit(dataPin, clockPin);
  
  if (val == B10000000)     //если нажата кнопка 8 то делаем
 {
    digitalWrite(ledPin, HIGH);  
    slovo = "HIGH#";                      // сохраняем в slovo
    
 } ;  
  
   if (val == B01000000)   //  если нажата кнопка 7
 {
    digitalWrite(ledPin, LOW); 
    slovo = "LOW#";
 };
  
}

byte SiftIn8bit(byte dataPin, byte clockPin){
  byte in8bit = 0;
  for(int i = 0; i < 8; i++){            
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) in8bit |= 1<<i;
    else in8bit &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  }
  
  return in8bit;
  
}

 

bit
Offline
Зарегистрирован: 07.05.2012

Спасибо большое тем кто помогал