Как сформировать пакет?
- Войдите на сайт для отправки комментариев
Пт, 08/03/2013 - 15:02
Привет всем форумчаном помогите пожалуйста в написании кода.
Суть кода такова , если приходит пакет с сериал порта
подобного типа
#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 = "";
}
}
Помогите пожалуйста новичку
Куда делась вкладка редактировать?
В названия темы ошибочка небольшая не сформируем, а как сформировать?
По нормальному обьясните что хотите.
Привет извиняюсь что так объясняю сейчас попытаюсь более подробней объяснить
Есть устройство которое посылает пакеты в формате NEX в мадам через TX
#15D23#5255637735R26252RRRW#552431526WWTFX763#
Я подключаю ардуино в цепь, то есть беру сигнал с устройства TX и подключаю в ардуино RX и соответственно TX с ардуино идeт в модем RX
Суть кода такова когда приходит пакет выше указного формата к ним нужно цеплять хвост #open# каторый формируется в ардуино с кнопак
И отправлять в RX на модем
Данные которые приходят с устройства постоянна меняются,
Не меняется только количество знаков
#4 символов # 20 символов # 35 символов #
Я так думаю что мы создаём переменную Val для считывания данных
И катко нужно создать формулу
Если приходит пакет в катарам находится знаки # и между ними определённое количество символов то мы к этому пакету привязываем хвост сформированный в ардуино #open# и отравляем этот пакет в сборе дальше в сериал.
Данные которые приходят с устройства постоянна меняются,
Не меняется только количество знаков
#4 символов # 20 символов # 35 символов #
Вот вы наконец-то сделали формальное представление поступающего пакета.
Теперь попробуйте изобразить, как выглядит отправляемый пакет.
PS: А. нашел. Отправляемый пакет выглядит вот так:
#4 символов # 20 символов # 35 символов # #open#
Теперь вопрос: если пришел пакет #15D23#5255637735R26252RRRW#552431526WWTFX763#, то отправляемый пакет должен выглядеть как #15D23#5255637735R26252RRRW#552431526WWTFX763# #open#.
Лучше друг под дружкой:
#15D23#5255637735R26252RRRW#552431526WWTFX763#
#15D23#5255637735R26252RRRW#552431526WWTFX763# #open#
Так или все же иначе?
И бога ради - не начинайте снова о рисунке обоев в вашей комнате. Обрисуйте только суть вопроса.
Еще вопрос: входящий пакет вы сами формируете или получаете из какого-либо чужого устройства?
Другими словами - может этот пакет выглядеть не так:
#15D23#5255637735R26252RRRW#552431526WWTFX763# а, например, так:
<15D23#5255637735R26252RRRW#552431526WWTFX763>
Входящий пакет с чужого устройства он выглядит именно так, но содержимое между # я не стал точно переписывать поскольку оно постоянно меняется
#15D23#5255637735R26252RRRW#552431526WWTFX763#
не меняется только количество знаков между #
А исходящий пакет с ардуино должен быть с привязкой
#15D23#5255637735R26252RRRW#552431526WWTFX763# #open#
Хотя хвост у пакета который отправляется можно сделать и таким
#15D23#5255637735R26252RRRW#552431526WWTFX763#open#
Входящий пакет с чужого устройства он выглядит именно так, но содержимое между # я не стал точно переписывать поскольку оно постоянно меняется
Никому - и программе в том числе - неинтересно, меняется или не меняется поступающая от внешнего устройства информация. В рамках постановки задачи, которая с трудом начинает освобождаться от ненужных подробностей, всем - и программе в том числе - важно знать, как модифицируется поступающая информация.
Я правильно понял:
1) поступивший пакет никак не изменяется, просто к нему привязывается хвост #open# (ну или open#)
2) поступающий пакет формируете не вы, поэтому влияния на него оказать не можете и он будет начинаться и кончаться именно знаками #
Ответьте на эти вопросы четко - "да" или "нет".
В этом коде хвост подставляется к приходящему пакету нооо
Если он такой же по содержанию, а нужно чтобы содержания не имело значении
if(slovo.substring(0,50) == "#15D23#5255637735R26252RRRW#552431526WWTFX763#") // Если с сериал приходит пакет # # # # то мы подставляем хвост #closed# к пакету и отпровляем в сериал { Serial.print(slovo); read_end = 0; slovo = ""; Serial.println("#Open#");1) поступивший пакет никак не изменяется, просто к нему привязывается хвост #open# (ну или open#)
ДА
2) поступающий пакет формируете не вы, поэтому влияния на него оказать не можете и он будет начинаться и кончаться именно знаками #
ДА
Тут вроде бы часть кода работает
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 = ""; }Но когда я пытаюсь прописать ещё одну сквозную команду то происходит вот что
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 = "";То получается такая ерунда
а если так
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 = ""; }Сейчас попробую
Попробовал не компилируется 18 строка
А если ковычки заменить на одиночные
вместо slovo.charAt(1) =="#" поставитьslovo.charAt(1) == '#' и т.д.Поменял компил проходит но программа не работает
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# нечего не приходит
а так
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 = ""; } }Я вот так сделал сейчас теперь текст #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 = "";Сейчас попробую
Так отправляется в серил но тоже хвост не подставляется
Отправляем: #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(); } }тоже вначале думал буфер пробегать, но потом решил раз есть .charAt, использовать его, но блин почемуто не работает
open# дописывается любой входящей строке, в которой присутствуют четыре шарпа(#), другие строки возвращаются как есть.
а почему бы не испоьзовать функцию
проверяя сколько в 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);Конкретно в данном случае это бессмысленно.
Зачем константу перезаписывать в буфер и выводить, если можно просто сразу вывести эту константу не записывая в буфер.
Всё заработало большое спасибо
Теперь осталось разобраться с формированием хвоста
Не могу сообразить как сохранить open# в slovo что бы его прочитать в Serial
if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то { slovo open# }if(sharp == 4) Serial.println("slovo");всё равно не понял
if (val == B00000011 && val2 == B00000000) // Если нажаты две кнопки то мы выпотные действие { slovo open# // сохраняем open# в slovoif(sharp == 4) Serial.println("slovo"); // отпровляем в сериал то что сохронино в slovoПодскажите как сохранения сделать?
if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то { strcpy(slovo,"open#") } Serial.Print(slovo); присваивание строки строке происходит при помощи функции strcpy();Чего та не получается
А вот так заработало
if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то { slovо = "open#"; } Serial.Print(slovo);А так?
Чего та не получается
не получаеться,потому что я забыл добавить ";" в конце строчки.а вы наверняка не исправили.
if (val == B00000011 && val2 == B00000000) // Если первый бит 11 то { strcpy(slovo,"open#"); } Serial.Print(slovo);bit, так скажите, вы все также используете объект класса String.slovo или все таки массив символов char slovo[] ?
Сейчас подождите чего та я тут опять напутал
Сейчас допишу код целиком и выложу
Вот код вроде всё работает так как нужно
Если в сериал приходит пакет в # то к нему цепляется хвост сформированный в зависимости от нажатой кнопки и оправляется в сериал
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; }Спасибо большое тем кто помогал