непонятки с Serial

Тема в разделе "Arduino & Shields", создана пользователем Kova23, 28 ноя 2014.

  1. Kova23

    Kova23 Нуб

    Имею ардуино уно и некий девайс который в последовательный порт выдает данные. вот пример данных от девайса в hex
    lc1_out.PNG
    B2 82 это заголовок, следующие 4 байта это данные.

    завел это дело в Ардуино и пробую получить эти данные и ничего не выходит. почему то значения которые получает ардуино с последовательного порта отличаются.
    Для получения цифр использовал совсем простой скетч который 6 значений подряд читает и их выводит на экран.

    Им на ЛСД выводятся цифры 253 95 0 147 101 159. переводим в hex и получаем не то же самое что в терминале на компе.

    Код (Text):
    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>
    // Инициализируем объект-экран, передаём использованные
    // для подключения контакты на Arduino в порядке:
    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    byte inByte1 = 0;        // incoming serial byte
    byte inByte2 = 0;
    byte inByte3 = 0;
    byte inByte4 = 0;
    byte inByte5 = 0;
    byte inByte6 = 0;
    void setup()
    {
        Serial.begin(19200);
        // устанавливаем размер (количество столбцов и строк) экрана
        lcd.begin(20, 4);

        lcd.setCursor(0, 1);
        lcd.print("Waiting for data");


    }
    void loop()
    {
     
      while (Serial.available() == 0) ;
     
      //read data
          inByte1 = Serial.read();    
          inByte2 = Serial.read();
          inByte3 = Serial.read();
          inByte4 = Serial.read();
          inByte5 = Serial.read();
          inByte6 = Serial.read();
         
    // output data to LCD
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(inByte1);
          lcd.setCursor(4, 0);
          lcd.print(inByte2);
       
          lcd.setCursor(0, 1);
          lcd.print(inByte3);
          lcd.setCursor(4, 1);
          lcd.print(inByte4);
       
          lcd.setCursor(0, 2);
          lcd.print(inByte5);
          lcd.setCursor(4, 2);
          lcd.print(inByte6);
     
       
        delay(1000);
    }
     
    причем цеплял тх с устройства одновременно на рх ардуино и рх на ком порте на компьютере и в терминале на компьютере видел те же цифры что выше, не совпадающие с теми цифрами что на экране. не пойму в чем ошибка моя?
    то что получаю в терминале на компе соответвует даташиту от девайса, так что там точно верные данные. а вот в ардуино у меня чтото не то читается.
     
  2. Kova23

    Kova23 Нуб

    сейчас только подумал. возможно проблема в том что параметры соединения в ардуино и в девайсе не совпадают? вот из спецификации на девайс выкопировка.
    isp_params.PNG
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    while (Serial.available() < 6) ;
    Это точно нужно сделать, иначе можете правильно читать первый байт, а остальные читать еще до того, как они примутся.
    А у девайса какой порт? RS-232? Ардуино понимает 0В как "0" и 5В как "1",
    а в RS-232 "0" передается отрицательным напряжением, а "1" положительным. Не может проблема в этом быть? И ссылку на даташит дайте на всякий случай.
     
    Последнее редактирование: 29 ноя 2014
  4. Kova23

    Kova23 Нуб

    да, это я уже понял, исправил.

    ссылка на даташит вот. девайс - широкополосный лямбда-зонд Innovate LC-1
    http://www.innovatemotorsports.com/support/downloads/Seriallog-2.pdf
    только я тут подумал что там не 5в а 12в. питается девайс по крайней мере 12в.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Если тут говорится о нем, то выходит, что нужно паять конвертер. Микросхема MAX-232 или аналог + 4 конденсатора, можно их напаять прямо на микросхему, подпаять провода и сунуть все в термоусадку.
     
    Kova23 нравится это.
  6. Kova23

    Kova23 Нуб

    всё, понял в чем ошибка. спасибо большое.
     
  7. Kova23

    Kova23 Нуб

    заюзал мах232 для преобразования TTL-RS232, всё заработало как надо. проблема решена.