LCD Display не корректные HEX данные

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем RomanVk, 15 апр 2017.

  1. RomanVk

    RomanVk Нуб

    Всем добрый день, пишу код для обработки кастомных HEX MIDI сообщений.
    Код (C++):
    ...
    byte Fire[10] = {0xF0,0x7F,0x01,0x02,0x7F,0x01,0x31,0x00,0x31,0xF7};
    ...
    if (dataByte[0] == 0xF0 && dataByte[i - 1] == 0xF7)
      {
        for (int k = 0; k < i; ++k)
        {
          lcd.setCursor(0, 0);
          lcd.print(k);
          lcd.print(" Byte ");
          lcd.print(dataByte[k], 16);
          lcd.setCursor(0, 1);
          lcd.print(k);
          lcd.print("*Byte ");
          lcd.print(Fire[k], 16);
    ...
    это часть кода, который проверяет определенное условие, и печатает на дисплей полученные данные по MIDI и данные из проверочного массива. Сам массив выглядит таким образом-{0xF0,0x7F,0x01,0x02,0x7F,0x01,0x31,0x00,0x31,0xF7}

    Такие же данные приходят по MIDI, но вот на дисплей выводится некоторые другие байты.
    {0xF0,0x7F,0x1F,0x2F,0x7F,0x1F,0x31,0x01,0x31,0xF7}
    Честно это сбивает с толку. Подскажите, с чем это связано?

    И сразу второй вопрос. Мне приходиться выводить данные для анализа, на LCD дисплей потому что я не могу их отправить в Serial Monitor. Скорость работы MIDI (31250), к сожалению в списке режимов работы монитора нет такой скорости, может есть возможность добавить свою собственную скорость работы?
     
    Последнее редактирование: 15 апр 2017
  2. RomanVk

    RomanVk Нуб

    Вообще то, у меня оба массива начинаются с этого элемента. Возможно при копирование кода, регистр изменился. 0xF0 стартовый байт сообщения.
     
  3. rkit

    rkit Гуру

    Вам не надо точно такой же бод рейт выставлять, для передачи данных в монитор. Главное, чтобы не меньше
     
  4. RomanVk

    RomanVk Нуб

    Да вот не помогает, в монитор приходят не данные а символы вопросов.
     
  5. rkit

    rkit Гуру

    Значит вы что-то другое не так делаете.
     
  6. RomanVk

    RomanVk Нуб

    Тогда подскажите пожалуйста, как в серийный монитор правильно вывести информацию переменной типа Byte в формате HEX в серийный монитор?
     
  7. rkit

    rkit Гуру

    Serial.print(byte, HEX)
     
  8. RomanVk

    RomanVk Нуб

    Всё сделал вроде правильно, но тем не менее, всё равно приходят, только символы вопросов.
    [​IMG]
     

    Вложения:

    • IMG_0921.JPG
      IMG_0921.JPG
      Размер файла:
      372,9 КБ
      Просмотров:
      429
  9. rkit

    rkit Гуру

    Ну значит неправильно.
     
  10. RomanVk

    RomanVk Нуб

    Вопрос прост, что же я сделал не правильно и что нужно сделать, что бы данные всё же выводились корректно?
     
  11. rkit

    rkit Гуру

    Я не знаю, что вы сделали. Я не экстрасенс.
     
  12. RomanVk

    RomanVk Нуб

    Спасибо за помощь.
     
  13. rkit

    rkit Гуру

    Ну может быть расскажете? Или код полностью выложите? Или модель платы? Я, конечно, понимаю, что противно слова использовать в общении с не-экстрасенсом, но что поделать.
     
  14. RomanVk

    RomanVk Нуб

    :)

    Модель палаты Arduino UNO

    Пожалуйта код-
    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
    byte commandByte;
    byte noteByte;
    byte velocityByte;
    byte dataByte[30];

    byte Fire[10] = {0xF0, 0x7F, 0x01, 0x02, 0x7F, 0x01, 0x31, 0x00, 0x31, 0xF7};

    int i = 0;

    void setup() {
      Serial.begin(31250);
      pinMode(7, OUTPUT);
      pinMode(6, OUTPUT);
      digitalWrite(7, LOW);
      digitalWrite(6, LOW);
      lcd.begin(16, 2);
    }

    void checkMIDI()
    {
      do
      {
        lcd.begin(16, 2);
        if (Serial.available())
        {
          dataByte[i] = Serial.read();
          ++i;
          digitalWrite(7 , HIGH);
          digitalWrite(6 , HIGH);
          delay(5);
          digitalWrite(7, LOW);
          digitalWrite(6, LOW);
        }
      }
      while (Serial.available());

      if (dataByte[0] == 0xF0 && dataByte[i - 1] == 0xF7)
      {
        for (int k = 0; k < i; ++k)
        {
          lcd.setCursor(0, 0);
          lcd.print(k);
          lcd.print(" Byte ");
          lcd.print(dataByte[k], 16);
          Serial.write(dataByte[k]);
          Serial.print(dataByte[k], HEX);
          lcd.setCursor(0, 1);
          lcd.print(k);
          lcd.print("*Byte ");
          lcd.print(Fire[k], 16);

          int y = 0;
          if (dataByte[k] == Fire[k])
          {
            y = 1;
            lcd.setCursor(10, 1);
            digitalWrite(6, HIGH);
            delay(50);
            digitalWrite(6, LOW);
          }
          else
          {
            digitalWrite(7, HIGH);
            delay(50);
            digitalWrite(7, LOW);
          }
          delay(500);

        }

      }
      else
        lcd.print("Whait");

    }

    void loop() {

      checkMIDI();
      delay(100);
      digitalWrite(7, LOW);
      digitalWrite(6, LOW);
      i = 0;

    }
     
     
  15. rkit

    rkit Гуру

    То есть вы с одного serial-порта читаете миди, и в него же пишете на компьютер?
    Так не будет работать, конечно же. Вам их нужно два независимых.
     
  16. RomanVk

    RomanVk Нуб

    Ага! Вот оно что. Спасибо. Скажите, а могу ли себе на этой плате назначить второй серийный порт?
     
  17. rkit

    rkit Гуру

    На уно только один порт, так что нет.
     
  18. RomanVk

    RomanVk Нуб

    Понял. Спасибо. Ещё один вопрос. Я работаю с данными и их обрабатываю в массиве. Если более удобный способ хранить данные типа Byte.
     
  19. rkit

    rkit Гуру

    Чем вас массивы не устраивают?
     
  20. RomanVk

    RomanVk Нуб

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