Помогите нубу с чтением массивов из COM порта.

Jacks_d
Offline
Зарегистрирован: 31.12.2011

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

Проблема в чем, массив интересует как способ передачи команд на несколько пинов ардуины, допустим отправил на ком порт данные в виде 1063, где первые два символа будит номер пина, третий и четвертый - его значение. На данный момент все выглядит так: не получается отправить значение больше "9", при отправке допустим "15", значение принималось с начала "1" а потом "5", и выполняются соответственно так же по очереди.

Т.е. напишите часть кода чтения массива из COM порта с комментариями, где что и как присваивается

Так же, вопрос: в каком виде лучше передавать массивы, в виде:
1) передавать полностью команды через запятую, которые нужно выполнить, например 1026, 3902, 1564 и читать его сразу
2) или по отдельности каждый по отдельности с новой строки
1026
3902
1564
и выполнять их по очереди, в частности это интересно с точки зрения прерывания
 

whoim
Offline
Зарегистрирован: 03.11.2011

 

void loop () {
  //read command from terminal
  RX();
  if(RX_Data[0] != NULL) {
  //select command
  //command uset (unixtime set)
  if(RX_Data[0]=='u'&&RX_Data[1]=='s'&&RX_Data[2]=='e'&&RX_Data[3]=='t') {
    RTC.adjust(strtol((char*)RX_Data + 4, NULL, 10));
    Serial.print("DateTime set to ");
    print_now();
    //Serial.print(strtol((char*)RX_Data + 4, NULL, 10));
    blink3();
  }
  //command now, print the date
  else if(RX_Data[0]=='n'&&RX_Data[1]=='o'&&RX_Data[2]=='w') {
    Serial.print("Now: ");
    print_now();
    blink3();
  }
  //command clear, clear the tasks
  else if(RX_Data[0]=='c'&&RX_Data[1]=='l'&&RX_Data[2]=='e'&&RX_Data[3]=='a') {
    Serial.println("Please wait...");
    tasks_clear();
    read_tasks();
    blink3();
  }
.......
//Serial read func
void RX() {
    byte RX_i = 0;
    byte b;
    while (Serial.available()) {
      b = Serial.read();
      if(b == 13) break;
      RX_Data[RX_i] =  b;
      RX_i++;
      if(RX_i > RX_Data_size - 1) break;
    }

}
//serial clear buffer func
void RX_Data_Clear(){
   for (int x = 0; x <= RX_Data_size - 1; x++) 
      RX_Data[x] = 0;
   Serial.flush();
}

 

whoim
Offline
Зарегистрирован: 03.11.2011

 #define RX_Data_size 22
#define pinLED 13
byte RX_Data[RX_Data_size]; //array for read serial data

Protez1999
Offline
Зарегистрирован: 08.07.2012

тотже вопрос тока ниче не понял

 

leshak
Offline
Зарегистрирован: 29.09.2011

whoim конечно проюмарил. дал "простенький пример для понимания".

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

 

Ребята, ей-богу, вы напоминаете 10-ти летку, который пришел в секцию единоборств:

Я не спортсмен (ну все, все сразу должны проникнутся).  Но мне нужно побить главного бяку-забияку во дворе.

Отжиматься? Не, скучно. Кросс? У меня в боку колет. Правильное питание? Буэ... не вкусно. Я вот в кино видел что есть такой секретый МультиМногоПяточныйУдарСоЩекоткой. Научите меня. Вам что жалко?

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

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

Вначале что-то простое, а уж потом "как принять данные с компа, вывести меню на экран, одновременно повернуть 35-ть серв и прочитать датчик температуры на расстоянии 150 метров, плавно меняя яркость у куба светодидов 100x100x100 подключенного через xbee шилд".

Ну дадут вам пример и что? Понять-то не сможете, потому что пример написан языком которого вы не знаете. А если повезет и кто-то даст вам "готовое решение", так ведь "сопровождать" вы его опять-таки не сможете. Это же не "магия" которую нужно запомнить. А магия которую нужно "понять". А без понимания это будет вечное "я вот надергал примеров из интернета, слил их в один файл, а оно не работает. помогите, я не программист! " Опять. а как же ты им станешь? Не хочешь? Ну так зачем скетчами-програмами занимаешься? Займись тем что нравится и в чем интерестно разбиратся.

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

P.S. Тому кто придумал маркетинговое "для работы с ардуиной не нужно знать программирования" я бы [БИП]....[БИП]... и проворотом.

P.S.S. А сам вопрос на форуме поднимался далеко не один раз. В разных ракурсах и вариациях. Так что если действительно есть желание - можно и попроще примерчик найти.

P.S.S.S. А со всем этим перечнем "что нужно знать", при желании, разобратся можно намного быстрее чем подогнать физическую подготовку в секции единоборств. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 И немного "по сути".

Если бы эту задачу решал я, даже имея годы программерства за спиной, но, предположим на не знакомой для себя платформе/языке, то я бы раздробил задачу так:  (я кушал слона по кусочкам):

  1.  Вначале объявил бы массив прямо в него "захардкодил" цифры-команды. Добился-бы мигания диодами в соотвествии с этими командами.
  2. Потом-бы обявил текстовую строку команду и научился ее "переводить/распарсивать" в этот массив.
  3. Потом бы научился принимать один байт из компа и делать что-то в соотвесвии с ним.
  4. Потом бы разобрался как читать много байт и запихивать это в массив. Потом "как в строку".
  5. Ну а к этому моменту как решить исходную задачу используя знания предыдущих 4-рех пунктов мне бы уже очевидно. Либо если бы были трудности я бы мог спросить совета. Но уже осмысленно и конкретно. И ответ мне бы был понятен. Скорее всего мне-бы просто указали на какую-то "ошибку/нюанс" и осталось-бы только "хлопнуть себя по лбу".  

Если предполжить что "программерского опыта нет" и слова "массив и захадкодил" не понятны, то каждый пункт дробил-бы еще мельче: что такое массив, как его объявлять, как обращатся к элементам, как записывать элементы и т.д. и т.п. Вообщем спускать до уровня "уверенных знаний" и отталкиваться от них. Не пропуская "ступеньки".

whoim
Offline
Зарегистрирован: 03.11.2011

 leshak, :D

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

Интернета не было. Но я осилил это как то.

Protez1999
Offline
Зарегистрирован: 08.07.2012

Так нахрена вы тогда вообще на форум этот ходите сидите и сами все тихонько делайте.  

Я столкнуля с проблемой что не могу передать по комп порту массив вернее не могу догнать как это сделать.

Делаю телеметрию для ру модели. Весь проект уперся в то что надо передавать а как не понимаю вернее понимаю но тока число 0-9. Я и сам ищу решение этой проблемы ну и тут написал. может получется быстреее от когото получить тут совет а может самому разобраться. А вы  как старые деды начинаите а вот в наше время воо было не так мы супер перцы и сами к этому пришли.

Если есть возможность распиши строку   4,7,8 не до конца догоняю

whoim
Offline
Зарегистрирован: 03.11.2011

 4) Если есть данные

7) Если данными пришла команда тектовая uset

8) загнать в DS1307 (часы) данные о времени

 

это тебе лишнее, делай цикл и в нем побайтно заноси в массив

Protez1999
Offline
Зарегистрирован: 08.07.2012

Пипец вот я тормоз . Не увидел что в цикле идет. А если можно напишите про 8 строку. А как передается это слово в массив. Я ведь смогу заменить буквы на цифры без проблем извините за тупость вопроса.

Все воюю никак не могу догнать про циклы но счас так немного что то уже прорисовывается. Я получую данные с 3 датчиков и через xbee передаю их на другую ардуину правда пока только с 1 датчика.