Передача нескольких значений по serial.

Тема в разделе "Arduino & Shields", создана пользователем greiverff, 11 сен 2012.

  1. greiverff

    greiverff Нерд

    Хорошо, если послать массив x= 1, 2, 3, 4, 5, 6 затем х= 7, 8, 9, 10, 11, 12
    Код (Text):
    Serial.rite(x, 6); \\где x[i] массив 6 длинна его
    та на мк считывать так?
    Код (Text):
    y=Serial.read();  \\где у - массив длинной 6
    Это пока что без проверки на целостность данных.
     
  2. greiverff

    greiverff Нерд

    Мк получит ведь бинарные значения и их надо будет, после того как они запишутся в массив, перевести в десятеричные?
     
  3. hibiki

    hibiki Гик

    зачем переводить? используйте их для управления
    Код (Text):

    char x[6];
    char idx = 0;
     
     
    void loop() {
        if ( (idx < 6) && (Serial.available() > 0) ) { // на каждом тике проверяем, есть ли, что читать
            x[++idx] = Serial.read();
        }
     
        if (idx == 6) {
            // В массиве x - все ваши считанные 6 байт
            // делаем что-то с массивом,
     
            idx = 0; // обнуляем idx - готовы к приему нового пакета
        }
    }
     
    в принципе, можно чтение в цикле за один прогон loop() сделать, но вы же хотите что-то делать, даже если ничего не пришло, а не висеть в ожидании?
     
  4. greiverff

    greiverff Нерд

    Да должно постоянно работать. Планировал после прихода и распознания массива присвоить значения определенным пинам.
    Например пара моторов управляется с аналоговых 1 и 2, ==> получив 6 значений первые 2 присваиваются пинам 1 и 2, остальные значения тоже присваиваютя соответствующим пинам. Правильно ли я понимаю, что пока принимается новый массив(или ничего не принимается), значения на пинах 1 и 2 продолжают выдавать моторам предыдущее значение.
     
  5. hibiki

    hibiki Гик

    опять же, как напишите :)

    если будете менять значения только по приходу всех байтов пакета - то да. но ничто не мешает установить пины в другие значения когда-нибудь еще (вне второго if'а, в данном случае)
     
  6. Возможно будет полезным.
    Вот код который я использую чтобы передать 30 байт с ПК на ардуино:
    PHP:
    //Arduino=====================================================Прием 30 байт
    void loop() {
      byte bits_num = 0;
      byte bits_val = 1;
      if(Serial.available()>32){
        if(Serial.read() == 0x2A){
          if(Serial.read() == 0x55){
            for(byte i=0; i<30; i++){
              data_in[i] = Serial.read();
            }
            bits_val = Serial.read();
            for(byte i=0; i<30; i++){
              bits_num=bits_num+num_bit(data_in[i]);
            }
     
            if(bits_val==bits_num){
              for(byte i=0; i<30; i++){
                //data_in[i]; проверенная информация
              }
     
            }
          }
        }
      }
     
    //чтото делаем...
    }
     
    byte num_bit(byte x){
      byte val =0 ;
      for(byte b=0;b<8;b++){
        if (x&0b00000001 == 0b00000001){
          val++;
        }
        x=x>>1;
      }
      return val;
    }
     
    //Processing=====================================================Отправка 30 байт
     
     
    void draw()
    {
      int bits_num = 0;
      for (i=0; i<30; i++) {
        bits_num=bits_num + num_bit(Data[i]);
      }
     
      port.write(0x2A);
      port.write(0x55);
      for (i=0; i<30; i++) {
        port.write((byte)(Data[i]));
      }
      port.write((byte)(bits_num));
      delay(1);
    }
     
    int num_bit(int x) {
      int var=0;
      int c = 0;
      for (int b=0;b<8;b++) {
        c = x & 0x01;
        if (c == 1) {
          var++;
        }
        x=x>>1;
      }
      return var;
    }
     
  7. hibiki

    hibiki Гик

    спасибо!

    greiverff, а вот вам и контроль четности :)
     
  8. greiverff

    greiverff Нерд

    Спасибо всем кто откликнулся, буду пробовать. О результате отпишусь.
     
  9. <Lame>

    <Lame> Гик

    serial.Read:D
     
  10. greiverff

    greiverff Нерд

    ) Напиши пожалуйста по подробнее, пожалуйста. Образец.
     
  11. greiverff

    greiverff Нерд

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

     
  12. greiverff

    greiverff Нерд

    Ура! Получилось передавать в 2-х "канальном" режиме.



    Код приемника:
    Код (Text):
    int val1=0;
    int val2=0;
     
    void setup()
    {
      pinMode(10,OUTPUT);
      pinMode(9,OUTPUT);
      Serial.begin(9600);
    }
     
    void loop()
    {
      if(Serial.available() && Serial.read() == 'a')
      {
        val1=Serial.read()-'0';
        val2=Serial.read()-'0';
        Serial.flush();
        val1=map(val1, 0, 9, 0, 255);
        val2=map(val2, 0, 9, 0, 255);
        analogWrite(9,val1);
        analogWrite(10,val2);
      }
     
      //Serial.print(val1);
      //Serial.print(" ");
      //Serial.print(val2);
      delay(50);
     
    }
    Код передатчика:
    Код (Text):
    int val1=0;
    int val2=0;
     
    void setup()
    {
      pinMode(0,INPUT);
      pinMode(5,INPUT);
      Serial.begin(9600);
    }
     
    void loop()
    {
      val1=analogRead(0);
      val1=map(val1, 0, 1024, 0, 10);
      val2=analogRead(5);
      val2=map(val2, 0, 1024, 0, 10);
     
      Serial.print('a');
      Serial.print(val1);
      Serial.print(val2);
     
      delay(50);
    }

    Подскажите, имеет ли такая система право на жизнь? Можно ли ее существенно улучшить? Пока более чем на 2 канала не пробовал.
     
    sanik нравится это.
  13. if(Serial.available() && Serial.read() == 'a')
    замените на
    if(Serial.available() && char(Serial.read()) == 'a')
    вот так:
    Код (Text):
    int val1=0;
    int val2=0;
     
    void setup()
    {
      pinMode(10,OUTPUT);
      pinMode(9,OUTPUT);
      Serial.begin(9600);
    }
     
    void loop()
    {
    if(Serial.available() && char(Serial.read()) == 'a')
      {
        val1=char(Serial.read());
        val2=char(Serial.read());
        Serial.flush();
        val1=map(val1, 0, 9, 0, 255);
        val2=map(val2, 0, 9, 0, 255);
        analogWrite(9,val1);
        analogWrite(10,val2);
      }
     
      //Serial.print(val1);
      //Serial.print(" ");
      //Serial.print(val2);
      delay(50);
     
    }
     
  14. А как вы подключили две ардуинки между собой? Интересно.
     
  15. greiverff

    greiverff Нерд

    Расскажите по подробнее, что это даст. Если честно, не понимаю(

    При помощи радиомодулей xbee(http://amperka.ru/collection/Platy/product/Modul-XBee).
     
  16. greiverff

    greiverff Нерд

    Еще хотел спросить. Для всех ли скетчей нужно что бы было delay()? Где-то читал, что без него ардуино не успевает отрабатывать по программе.
     
  17. Код (Text):
    Для всех ли скетчей нужно что бы было delay()?
    Катаюсь по полу от смеха :D
    Конечно нет!:)
    Код (Text):
    Расскажите по подробнее, что это даст. Если честно, не понимаю(
    Можно будет передавать символы.
     
  18. hibiki

    hibiki Гик

    заворачивание в char() ничего не дает, кроме явного приведения типов (нафиг там не нужного, по сути, но так красивее. и, возможно, исчезнет ворнинг компилятора на это место, если он вообще есть).

    как и в случае с Serial.read()-'0'
     
  19. greiverff

    greiverff Нерд

    Компилятор не ругается, значит все норм)
     
  20. <Lame>

    <Lame> Гик

    лучше по i2c я только по нему и передаю! Лучше i2c ничего нет для связи двух дунек