Посылка чисел через UART

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Здравствуйте.

Мне нужно послать 16 целых чисел разделённых запятой по UART.

Эти числа я хочю засунуть в массив, причём мне надо чтобы в массиве были именно числя а не их аски код.

Помогите пожалуйста решить эту задачку.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Тот же случай, что и http://arduino.ru/forum/programmirovanie/pomogite-s-kodom-7 ?

Radjah
Offline
Зарегистрирован: 06.08.2014

Читать от "\n" до "\n", рубить по запятым, преобразовывать строку в целое.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Araris пишет:

Тот же случай, что и http://arduino.ru/forum/programmirovanie/pomogite-s-kodom-7 ?

Нет не тот.

Я просто искал какие нибуть примеры, как из чисел получить цифры.

Вот кое что нашол http://arduino.ru/forum/programmirovanie/perevod-prinyatogo-simvola-s-com-porta-v-chislo

От этого буду плясать :)

Araris
Offline
Зарегистрирован: 09.11.2012

Ну и хорошо, что не тот случай.

Прежде всего ответьте, умеете ли Вы получать с помощью Serial.read длинную строку вида "1,2,34,567,8,9,10" в символьный массив, или в String ?

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Нет. Но с помощю того примера наверное смогу.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Вот тебе простой пример разбора строки


String myString =  "";
String xval;
String yval;

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

void loop() {

  if (Serial.available() > 0) {
    myString = Serial.readString();
xval = getValue(myString, ':', 0);
yval = getValue(myString, ':', 1);

Serial.print("X:" + xval);
Serial.println("Y:" + yval);
float  xvalue = xval.toInt();
Serial.println((xvalue)/100.0);     
                                              }


}


String getValue(String data, char separator, int index)
{
 int found = 0;
  int strIndex[] = {
0, -1  };
  int maxIndex = data.length()-1;
  for(int i=0; i<=maxIndex && found<=index; i++){
  if(data.charAt(i)==separator || i==maxIndex){
  found++;
  strIndex[0] = strIndex[1]+1;
  strIndex[1] = (i == maxIndex) ? i+1 : i;
  }
 }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Спасибо большое.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Zahar пишет:

Нет. Но с помощю того примера наверное смогу.

ОК, вот с приема в строку/массив и начните. А к парсингу потом перейдем.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Может это поможет.

Сам этим сейчас интерисуюсь.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013
Ну наконец то родил:)
// 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
char a = 0;
long b = 0;
int table[18];
int cont;
void setup() {                
  Serial.begin(9600);
  }
void uart_rx(){
 while(cont<=17){
  if(Serial.available()){
    delay(2);
    a = Serial.read();
    if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9"
      b *= 10;
      b += a - 48;      
    }
  }
  //Serial.print("b=");
  //Serial.println(b);
  if(a==44){             // ","
    table[cont]=b;       //заполнение таблици
    cont++;             //увеличение счетчика
   // if(cont>17) cont=0; //если перебор, обнуление счетчика
    b=0;                //если пришла запятая, то это конец цифры, обнуление b
    } 
  } 
  cont=0;
}
void loop() {
  uart_rx();
  
  for(int i=0;i<=17;i++){ // проверка таблици
    Serial.print("i=");
    Serial.print(i);
    Serial.print(" ");
    Serial.print("table=");
    Serial.println(table[i]); 
  }

while(1);
}

 

 

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

Жесть, конечно, но посмотрим как преподаватель оценит. С родами Вас, с разрешением так-сказать!

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Какой препод?

Я это для себя делаю.

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

Ну, это Ваше дело :)

Radjah
Offline
Зарегистрирован: 06.08.2014

5 - добавь = 0

15 и 16 вполне можно объединить.

ЕМНИП, Serial.read() не умеет читать 0x00.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Radjah пишет:

5 - добавь = 0

Radjah я не понял , про что вы говорите?

Araris
Offline
Зарегистрирован: 09.11.2012

Строка 5 : int cont = 0; // Объявляем и инициализируем.

Строки 2,3,5 лучше перенесите между 9-й и 10-й, эти переменные нужны только внутри функции uart_rx(), нечего им глобальными быть. 

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

Ну, блин, набросились на человека. Он с Вами радостью поделился, а вам бы только строкм объединять, да переносить :)))

Araris
Offline
Зарегистрирован: 09.11.2012

Я бы назвал это конструктивной критикой.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Критику я люблю .

Так что критикуйте побольше :)

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Господа, Товарищи помогите !!!!!!

Знаю что написал какую то чушь, но ничего в голову после недели работы над этим кодом не приходит.

Сначала объясню чего пытаюсь добиться.
Делаю таймер для ледов на шесть каналов. При чём нужно регулировать яркость, время включения, время отключения на каждый из шести каналов в отдельности. Управление через bluetooth с андроида.

Для Андроида мне пишут прогу которая будет посылать стринг из восемнадцати цифр разделённых запятой, например (255,1000,500,255,600,500,255,1000,600,255,1000,800,255,1000,900,255,900,500,).

В моей проге я сначала собираю эти цифры в массив а потом работаю с этим массивом.

Пока что первая часть работает. А вот вторая часть не совсем.

Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.

//255,500,100,255,1000,600,255,1000,600,255,1000,800,255,1000,900,255,900,500,
int out1 = 3;      // LED connected to digital pin 3
int out2 = 5;      // LED connected to digital pin 5
int out3 = 6;      // LED connected to digital pin 6
int out4 = 9;      // LED connected to digital pin 9
int out5 = 10;    // LED connected to digital pin 10
int out6 = 11;    // LED connected to digital pin 11
long table[18]={0};
long previousMillis_on1 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА1
long previousMillis_off1 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА1
long previousMillis_on2 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА2
long previousMillis_off2 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА2
long previousMillis_on3 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА3
long previousMillis_off3 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА3
long previousMillis_on4 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА4
long previousMillis_off4 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА4
long previousMillis_on5 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА5
long previousMillis_off5 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА5
long previousMillis_on6 = 0;        // храним время последнего переключения светодиода ДЛЯ ПОРТА6
long previousMillis_off6 = 0;       // храним время последнего переключения светодиода ДЛЯ ПОРТА6
boolean flag_uart=false;
long sum1;
  long sum2;
  long sum3;
  long sum4;
  long sum5;
  long sum6;
   void initt(){
    flag_uart=true;
    sum1=table[1]+table[2];
    sum2=table[4]+table[5];
    sum3=table[7]+table[8];
    sum4=table[10]+table[11];
    sum5=table[13]+table[14];
    sum6=table[16]+table[17];
    Serial.print("sum1=");
    Serial.println(sum1);
    Serial.print("sum2=");
    Serial.println(sum2);
    Serial.print("sum3=");
    Serial.println(sum3);
    Serial.print("sum4=");
    Serial.println(sum4);
    Serial.print("sum5=");
    Serial.println(sum5);
    Serial.print("sum6=");
    Serial.println(sum6);
    }
  
void setup() {                
  Serial.begin(9600);
    uart_rx();
    initt();  
}

void uart_rx(){
  char a = 0;
  long b = 0;
  int cont=0;
  while(cont<=17){
    if(Serial.available()){
    delay(2);
    a = Serial.read();
    if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9"
      b *= 10;
      b += a - 48;      
    }
     }
    if(a==44){             // ","
      table[cont]=b;       //заполнение таблици
      cont++;             //увеличение счетчика
      b=0;                //если пришла запятая, то это конец цифры, обнуление b
    } 
  } 
  cont=0;
}

 
void loop() {
  unsigned long currentMillis = millis();
//  if(Serial.available()){
//  }
    /*   
   for(int i=0;i<=17;i++){ // проверка таблици
   Serial.print("i=");
   Serial.print(i);
   Serial.print(" ");
   Serial.print("table=");
   Serial.println(table[i]); 
   }
   */
   if(flag_uart){
  //////////////// ПОРТ 1 //////////////////////////////////////////////////////////
  if(currentMillis > table[1]) {
  //  previousMillis_on1 = currentMillis; // сохраняем время последнего переключения
    table[1]+=sum1;
    analogWrite(out1,table[0]);
    
  }

  if (currentMillis > table[2]){
  //  previousMillis_off1 = currentMillis; // сохраняем время последнего переключения
      table[2]+=sum1;
      analogWrite(out1,0);
  }
  //////////////////////////////////////////////////////////////////////////////////
  //////////////// ПОРТ 2 //////////////////////////////////////////////////////////
  if(currentMillis > table[4]) {
   // previousMillis_on2 = currentMillis; // сохраняем время последнего переключения
    table[4]+=sum2;
    Serial.print("table[4]=");
   Serial.println(table[4]);
    analogWrite(out2,0);
  }

  if (currentMillis > table[5]){
  //  previousMillis_off2 = currentMillis; // сохраняем время последнего переключения
    table[5]+=sum2;
    Serial.print("table[5]=");
   Serial.println(table[5]);
    analogWrite(out2,table[3]);
  }
  //////////////////////////////////////////////////////////////////////////////////
   }
  
}

 

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вы бы ещё на 300 бодах попробовали работать......
9600 не есть максимальная скорость

Проверьте на 115200

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Я никуда не спешу :)

На самом деле чтобы изменить скорость нужно переконфигурировать bluetoth. Я просто не вижу в этом смысла.

Кстати я посмотрел пример который предоставил leshak 

в своей статье http://arduino.ru/forum/programmirovanie/eshche-raz-migaem-svetodiodom-bez-delay и у меня наконец то всё получилось. Может коряво написано но зато РАВОТАЕТ :).

//255,500,100,255,1000,600,255,1000,600,255,1000,800,255,1000,900,255,900,500,
#define out1 3      // CH connected to digital pin 3
#define out2 5      // CH connected to digital pin 5
#define out3 6      // CH connected to digital pin 6
#define out4 9      // CH connected to digital pin 9
#define out5 10     // CH connected to digital pin 10
#define out6 11     // CH connected to digital pin 11
long table[18]={0};  

void setup() {
  Serial.begin(9600);
}
void uart_rx(){
  char a = 0;
  long b = 0;
  int cont=0;
  while(cont<=17){
    // if(Serial.available()){
    delay(2);
    a = Serial.read();
    if(a >= 48 && a <= 57){ //"0,1,2,3,4,5,6,7,8,9"
      b *= 10;
      b += a - 48;      
    }
    // }
    if(a==44){             // ","
      table[cont]=b;       //заполнение таблици
      cont++;             //увеличение счетчика
      b=0;                //если пришла запятая, то это конец цифры, обнуление b
    } 
  } 
  cont=0;
}  
void loop()
{
  byte delta=0; 
  if(Serial.available()){
    uart_rx();
  }
  blinkCH1(delta+0);
  blinkCH2(delta+3);
  blinkCH3(delta+6);
  blinkCH4(delta+9);
  blinkCH5(delta+12);
  blinkCH6(delta+15);

}
//////////////////////CH1////////////////////
void blinkCH1(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out1,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out1,0);//OFF
    }
  } 
}
//////////////////////CH2////////////////////
void blinkCH2(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out2,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out2,0);//OFF
    }
  } 
}
//////////////////////CH3////////////////////
void blinkCH3(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out3,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out3,0);//OFF
    }
  } 
}
//////////////////////CH4////////////////////
void blinkCH4(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out4,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out4,0);//OFF
    }
  } 
}
//////////////////////CH5////////////////////
void blinkCH5(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out5,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out5,0);//OFF
    }
  } 
}
//////////////////////CH6////////////////////
void blinkCH6(byte delta){
  static unsigned long period= table[2+delta]; // текущий интервал мигания
  static unsigned long prevMillis=0;
  if( (millis()-prevMillis)>=period){
    prevMillis=millis();
    if (period==table[2+delta]){//ON
      period=table[1+delta];
      analogWrite(out6,table[0+delta]);
    }
    else {
      period=table[2+delta];
      analogWrite(out6,0);//OFF
    }
  } 
}

Так что leshaku очередное спасибо.

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

Zahar пишет:

Во первых, пример "Мигаем светодиодом без delay()" не подходит так как там используеться для on/off только одно время задержки а у меня их два. И во вторых, когда контроллер начинает принимать с uart данные то диоды начинают хаотично моргать.

С чего Вы взяли, что этот пример не подходит?

Тут важен принцип.

Если у Вас не одно время, а два, да еще меняющаяся яркость, значит, нужно ввести не одну переменную, а три. А если светодиодов 6, 30, 100..., то объединяем эти три переменные в структуру и вводим массив этих структур - по одному элементу на светодиод.

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

andriano пишет:

С чего Вы взяли, что этот пример не подходит?

Странный Вы человек. Вам же ясно написали "там одно время задержки, а тут два"

andriano пишет:

Тут важен принцип.

Нет, тут как раз нет. Принцип важен там, где человек хочет сделать сам "по образу и подобию", а здесь нужен (важен) просто готовый код.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

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

Принцип важен там, где человек хочет сделать сам "по образу и подобию", а здесь нужен (важен) просто готовый код.

Я не понял, в чей огород этот камень? Если это в мой, то тогда вы не правы.

Я перед тем как задать свой вопрос около 4-5 дней пытался решить эту задачку но не смог ):

Я честно хотел изобрести свой велосипед, не получилось, пришлось просить помощь зала :)
Так что мне ПРИНЦИП важен.