Не преобразует в кириллицу принятый байт по уарту (utf8rus)

Тема в разделе "Флудилка", создана пользователем Рокки1945, 8 июн 2020.

  1. Рокки1945

    Рокки1945 Гуру

    Можно следующий вопрос уважаемые форумчане? Или надо новую тему создавать?
     
  2. SergeiL

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

    Ставьте в конце 0, а то напоритесь на хлам на индикаторе.
    char str [11] = {208,
    188,
    208,
    176,
    208,
    188,
    208,
    176,
    13,
    10,
    0}; // мама вышла!!![/QUOTE]
     
  3. SergeiL

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

    Так с Ардуино на комп, так и было.
    Со стороны компа на Ардуино - похоже изменили на UTF-8. Была Win-1251, по крайней мере на 1.8.5
     
    issaom нравится это.
  4. Рокки1945

    Рокки1945 Гуру

    [/QUOTE]
    !!!не пойму почему дисплей не отрабатывает ???
    char incoming;
    void loop() {
    if(Serial.available() > 0) {
    char incoming = Serial.read(); // Считываем первый входящий байт
    }
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(utf8rus(incoming));
    if(--x < -36) {//влияет на смену следующего цикла
    x = matrix.width();
    if(++pass >= 3) pass = 0;
    matrix.setTextColor(colors[pass]);
    }
    matrix.show();
    delay(10);
    }
     
  5. SergeiL

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

    А что вы хотите увидеть?
    Вставьте код правильно, может понятней станет.
    Loop крутится постоянно. Вы проверяете наличие пришедшего символа, выводите его, и на следующем цикле loop() очищаете экран.
    Скобка закрывающая IF у вас где стоит?
     
    Рокки1945 нравится это.
  6. NikitOS

    NikitOS Король шутов Администратор

    Ну если бы правила читали, вопросов бы не было. 5.11
     
    Рокки1945 и issaom нравится это.
  7. Рокки1945

    Рокки1945 Гуру

    прочёл
    что-то не хочет

    char incoming[1] = {'h'};
    void loop() {
    if(Serial.available() > 0) {
    incoming[1] = {Serial.read()}; // Считываем первый входящий байт

    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(utf8rus(incoming));
    if(--x < -36) {//влияет на смену следующего цикла
    x = matrix.width();
    if(++pass >= 3) pass = 0;
    matrix.setTextColor(colors[pass]);
    }
    matrix.show();
    delay(10);}
    }
     
  8. b707

    b707 Гуру

    ВСТАВЛЯЙТЕ КОД ПРАВИЛЬНО!!!
    а по смыслу этот код ничем не отличается от предыдущего. массив с одним элементов - это все равно что одиночный символ
    Вы языка С++ вообще не знаете? - зачем тогда сразу браться за сложную тему

    Или тоже студент? на лекции не ходил, в голове пусто. ПАМАГИТЕ! Экзамены!!! - так чтоли?
     
    Рокки1945 и NikitOS нравится это.
  9. b707

    b707 Гуру

    да он и не выводит. Берет половину символа и кидает в utf8rus() . И чего получится? - ничего
    И да, потом еще и экран очищает.

    Такое впечатление. что он абсолютно ничего не поял из обьяснений про кодировку на предыдущих двух страницах... Случай. имхо, безнадежный. По крайней мере на нынешнем этапе. Надо знания прокачивать
     
    SergeiL и Рокки1945 нравится это.
  10. NikitOS

    NikitOS Король шутов Администратор

    Да?
     
  11. Рокки1945

    Рокки1945 Гуру

    Нормально всё - пинайте - ничего страшного. Хочется докопаться до истины. Вот почему когда
    //Serial.begin(9600); закомментирован код работает, когда раскомментируешь на дисплее ничего нету?
     
  12. Рокки1945

    Рокки1945 Гуру

    Код (C++):
    #define maxString 101//длина максимальная приёма символов
    char target[maxString + 1] = "";

    char *utf8rus(char *source)

    {
      int i,j,k;
      unsigned char n;
      char m[2] = { '0', '\0' };
      strcpy(target, ""); k = strlen(source); i = j = 0;


      while (i < k) {

        n = source[i]; i++;

        if (n >= 0xC0) {

          switch (n) {

            case 0xD0: {

              n = source[i]; i++;

              if (n == 0x81) { n = 0xA8; break; }

              if (n >= 0x90 && n <= 0xBF) n = n + 0x30;

              break;

            }

            case 0xD1: {

              n = source[i]; i++;

              if (n == 0x91) { n = 0xB8; break; }

              if (n >= 0x80 && n <= 0x8F) n = n + 0x70;

              break;

            }

          }

        }


        m[0] = n; strcat(target, m);

        j++; if (j >= maxString) break;

      }

      return target;

    }
    Код (C++):
    // Adafruit_NeoMatrix example for single NeoPixel Shield.
    // Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation.

    #include <Adafruit_GFX.h>
    #include <Adafruit_NeoMatrix.h>
    #include <Adafruit_NeoPixel.h>
    #ifndef PSTR
    #define PSTR // Make Arduino Due happy
    #endif

    #define PIN 6

    // MATRIX DECLARATION:
    // Parameter 1 = width of NeoPixel matrix
    // Parameter 2 = height of matrix
    // Parameter 3 = pin number (most are valid)
    // Parameter 4 = matrix layout flags, add together as needed:
    //   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
    //     Position of the FIRST LED in the matrix; pick two, e.g.
    //     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
    //   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
    //     rows or in vertical columns, respectively; pick one or the other.
    //   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
    //     in the same order, or alternate lines reverse direction; pick one.
    //   See example below for these values in action.
    // Parameter 5 = pixel type flags, add together as needed:
    //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
    //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
    //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
    //   NEO_GRBW    Pixels are wired for GRBW bitstream (RGB+W NeoPixel products)
    //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)


    // Example for NeoPixel Shield.  In this application we'd like to use it
    // as a 5x8 tall matrix, with the USB port positioned at the top of the
    // Arduino.  When held that way, the first pixel is at the top right, and
    // lines are arranged in columns, progressive order.  The shield uses
    // 800 KHz (v2) pixels that expect GRB color data.
    Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(56, 8, PIN,
      NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
      NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
      NEO_GRB            + NEO_KHZ800);

    const uint16_t colors[] = {
      matrix.Color(255, 123, 224), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };
    /*
    const int size_buff = 100;//размер буфера максимум
    int uart_buff_pos = 0;//
    byte uart_buff[size_buff];

    ISR (USART0_RX_vect) {
      if (uart_buff_pos<size_buff) {
          uart_buff[uart_buff_pos]=UDR0;
          uart_buff_pos++;
      }else {
        uart_buff_pos=0;
     
      }
    }
    */

    void setup() {
      //Serial.begin(9600);
      matrix.begin();
      matrix.setTextWrap(false);
      matrix.setBrightness(255);
      matrix.setTextColor(colors[0]);
      matrix.cp437(true);
    }
    int x    = matrix.width();
    int pass = 0;
    //char str [40] = "МАМА МЫЛА РАМУ";
    char str [17] = {208,
    188,
    208,
    176,
    208,
    188,
    208,
    176,
    13,
    10};
    //String z = String((char*) str);
    //String z = "мяй";
    //char str [40] = String z;

    //char incoming[6] = {208,188,209,131,13,10};
    void loop() {
      matrix.fillScreen(0);
      matrix.setCursor(x, 0);
      matrix.print(utf8rus(str));
      if(--x < -36) {//влияет на смену следующего цикла
        x = matrix.width();
        if(++pass >= 3) pass = 0;
        matrix.setTextColor(colors[pass]);
      }
      matrix.show();
      delay(10);
    }
    что за конфликт между serial и кодом?
     
  13. SergeiL

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

    А если подробнее описывать ситуацию?
    Что вы подключаете к Ардуино? С чего выводите на Ардуино, какая программа?
    Если из Ардуино ИДЕ, из монитора порта, какая скорость указана в мониторе порта?
    Тут:

    upload_2020-6-9_18-26-3.png
     
  14. Рокки1945

    Рокки1945 Гуру

  15. Рокки1945

    Рокки1945 Гуру

    прошу прочесть пост 52 - почему-то идёт конфликт между сериал и матрицей
     
  16. SergeiL

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

    Схему вижу, схема в протеусе, а что реально? На схеме нет HC-05, нет CH340G, нет телефона. CH340G - это USB-UART. Куда подключаем USB, куда UART?
    Реальной схемы нет? Только в протеусе?
     
  17. Рокки1945

    Рокки1945 Гуру

    HC-05 - CH340G (да это усб уарт) - телефон - это всё живое и соединено и работает - проверено в терминале на компьютере. А в протеусе эмулятор уарта и ардуино.
     
    Последнее редактирование модератором: 9 июн 2020
  18. Рокки1945

    Рокки1945 Гуру

    идёт конфликт между serial и кодом?
     
  19. SergeiL

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

    Ну и отлично!
     
    Рокки1945 нравится это.
  20. SergeiL

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

    И опять же, если смотреть код функции utf8rus(char*source):
    Код (C++):
    char *utf8rus(char *source)

    {
      int i,j,k;
      unsigned char n;
      char m[2] = { '0', '\0' };
      strcpy(target, ""); k = strlen(source); i = j = 0;


      while (i < k) {
    .......................................................................
    Мы видим функцию:
    Код (C++):
    k=strlen(source);
    А дальше
    Код (C++):
    while (i < k) {
    А что мы видим в скетче:
    Код (C++):
    [QUOTE="рокки1945, post: 263311, member: 9785"]char str [17] = {208,
    188,
    208,
    176,
    208,
    188,
    208,
    176,
    13,
    10};[/QUOTE]
    ГДЕ 0 в конце?

    strlen() - строковая функция, она возвращает длину строки.
    А строка в Си - ОБЯЗАТЕЛЬНО ДОЛЖНА ЗАКАНЧИВАТЬСЯ 0.
    strlen() ищет 0, вам повезло, у вас данные глобальные, они ициализируются 0,
    а если бы были локальные?
    Устал писать это!
    ЭТО НУЖНО ЗАПОМНИТЬ раз и навсегда!
    Выделяете память под строку и инициализируете ее как массив, не забываем записать 0 в конце!!!
    И массив нужно выделять на 1 символ больше чем строка, так как в массиве, последним символом, должен быть 0.
    Иначе будете потом мучиться и искать ошибки.
     
    Рокки1945 нравится это.