Важная информация

User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 42

Тема: Вопросы начинающего Ардуинщика...

  1. #1
    Guru Аватар для SoftFelix
    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    2,975
    Спасибо Благодарностей отдано 
    172
    Спасибо Благодарностей получено 
    102
    Поблагодарили
    88 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Вопросы начинающего Ардуинщика...

    Очень хочется разобраться, но туплю по-страшному. Именно в программировании на Си (Ардуино IDE). Ещё два месяца тому назад я понятия не имел с данным синтаксисом. В наличии китайская Ардуино UNO (на CH340G). Кое-что ужЕ понимаю. На Спекке очень давно писал на Басике и Ассме, но без фанатизма. Сейчас есть цель написать поддержку автономного программатора для отечественного микроконтроллера 1986ВЕ91Т на базе Ардуино. Связь через UART (Rx-Tx с преобразователем UART TTL <-> RS-422), чтение с SD. Железо всё ужЕ разработал и собрал - всё работает. Фото будет чуть позже. Нужен человек (люди), способный спокойно подсказать по алгоритму и синтаксису.

    Сейчас дошло время до процедуры начальной синхронизации с МК. Там по даташиту и исходникам для ПЦ (тоже на Си++ ) всё довольно "протсто":

    1. Цикле заслали в порт 512 байт с кодом 0х00 (512 нулей). На ПЦ это делается дважды.
    2. МК должен ответить тремя (3) байтами - 0d, 0a, 3e - это успешная синхронизация. На ПЦ просто проверяют, что пришло 3 байта и НЕ парсят их.
    3. Если ответил иное - ошибка.

    На ПЦ это выглядит так:

    Код:
    txdbuf[0] = 0x0;
    	for(i=0;i<512;i++)
    		com.WriteBlock(txdbuf,1);
    	if	(!com.ReadBlock(rxdbuf,3))
    	{
    		for(i=0;i<512;i++)
    			com.WriteBlock(txdbuf,1);		
    		if	(!com.ReadBlock(rxdbuf,3))
    		{
    			str = "ошибка синхронизации!";
    			InsertStrToList();		
    			com.Close();
    			return;
    		}
    	}
    
    	m_list.DeleteString(m_list.GetCount()-1);
    	str = "Синхронизация...ОК!";
    Я родил вот это, но оно всегда пишет (у меня вывод на LCD 16X2) "Succes!".

    Код:
    void SYNC_1986(){ //функция синхронизации с 1986ВЕ91
    
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Try to Sync...");
      lcd.setCursor(5,1); //подготовим позицию для печати результата ("Failed!" / "Succes!")
       
      while(Serial.available()) Serial.read(); //вот это работает - очищает буфер UART'перед работой!!!
    
     for (int i=0; i < 512; i++){
          Serial.write(0); //выдали в порт 512 байт 0х00
     }
           if (!Serial.available() == 3){ //приняли 3 байта от контроллера?
            lcd.print("Failed!");       }
              else {
                lcd.print("Succes!");
                   }
                               }

    Добавил фото программатора (внутри Ардуино УНО с обвесом).















    Последний раз редактировалось SoftFelix; 12.02.2020 в 22:57. Причина: добавил фото
    МГТФ - любимый провод!
    KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,712
    Спасибо Благодарностей отдано 
    431
    Спасибо Благодарностей получено 
    208
    Поблагодарили
    186 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    +

    2. МК должен ответить тремя (3) байтами - 0d, 0a, 3e - это успешная синхронизация. На ПЦ просто проверяют, что пришло 3 байта и НЕ парсят их.
    у Arduino есть окно терминала под выбранный порт. Посмотрите, что там MCU выводит. Только придется выход с lcd на Arduino переключить. По программам ничего не скажу, нужно смотреть описание
    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Serial.available()
    Вообще лучше отлаживать "step by step" и железо тоже.
    Последний раз редактировалось andrews; 10.02.2020 в 15:17.

  4. #3
    Veteran Аватар для Tronix
    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,940
    Спасибо Благодарностей отдано 
    79
    Спасибо Благодарностей получено 
    240
    Поблагодарили
    118 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Код:
    if (!Serial.available() == 3){ //приняли 3 байта от контроллера?
            lcd.print("Failed!");       }
              else {
                lcd.print("Succes!");
                   }
    Я ни разу не гуру Си, потомушта сам Паскалист, но вот тут в условие какая-то не однозначность есть точно. Нужно написать либо
    Код:
    if (Serial.available() != 3)
    , либо
    Код:
    if !(Serial.available() == 3)
    Имхо.

  5. Этот пользователь поблагодарил Tronix за это полезное сообщение:

    SoftFelix (10.02.2020)

  6. #4
    Guru Аватар для SoftFelix
    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    2,975
    Спасибо Благодарностей отдано 
    172
    Спасибо Благодарностей получено 
    102
    Поблагодарили
    88 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Tronix, нет, ! именно в скобках. Иначе ругается компилятор. И так же в ПЦшном исходнике.
    МГТФ - любимый провод!
    KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL

  7. #5
    SoftWareGuy
    Гость

    По умолчанию

    Как правильно заметил Tronix, там ошибка.

    (!Serial.available() == 3)

    Сначала выполняется оператор "!" и он инвертирует результат available, далее bool сравнивается с int, и на выходе будет конечно же false, т.к. 1 или 0 сравнивается с 3.

    Если нужно выдавать Failed если в данный момент доступно отличное от 3 количество байт, то условие будет следующим:
    (Serial.available() != 3)
    Последний раз редактировалось SoftWareGuy; 10.02.2020 в 15:32.

  8. Этот пользователь поблагодарил SoftWareGuy за это полезное сообщение:

    SoftFelix (10.02.2020)

  9. #6
    Veteran Аватар для Tronix
    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,940
    Спасибо Благодарностей отдано 
    79
    Спасибо Благодарностей получено 
    240
    Поблагодарили
    118 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    . Иначе ругается компилятор.
    Да, прально ругается, надо так: if (!(Serial.available() == 3)) . Но как я и SoftWareGuy уже сказали, чтобы не косить под индусов, правильно написать так:
    if (Serial.available() != 3)

  10. Этот пользователь поблагодарил Tronix за это полезное сообщение:

    SoftFelix (10.02.2020)

  11. #7
    Guru Аватар для SoftFelix
    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    2,975
    Спасибо Благодарностей отдано 
    172
    Спасибо Благодарностей получено 
    102
    Поблагодарили
    88 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Tronix,
    SoftWareGuy, точно! Переписал на:

    Код:
    if (Serial.available() != 3){ //приняли 3 байта от контроллера?
            lcd.print("Failed!");       }
              else {
                lcd.print("Succes!");
                   }
    И вроде заработало. Т.е. вот это (if (Serial.available() != 3)) читается "если в буфере Rx не 3 байта, то далее делаем"?
    МГТФ - любимый провод!
    KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL

  12. #8
    Veteran Аватар для Tronix
    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,940
    Спасибо Благодарностей отдано 
    79
    Спасибо Благодарностей получено 
    240
    Поблагодарили
    118 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Т.е. вот это (if (Serial.available() != 3)) читается "если в буфере Rx не 3 байта, то далее делаем"?
    Это, а именно !=, читается как "не равно". Если Serial.available() не равно 3, то Failed, иначе - Success!

  13. Этот пользователь поблагодарил Tronix за это полезное сообщение:

    SoftFelix (11.02.2020)

  14. #9
    Guru Аватар для SoftFelix
    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    2,975
    Спасибо Благодарностей отдано 
    172
    Спасибо Благодарностей получено 
    102
    Поблагодарили
    88 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Как выяснилось, вот эта конструкция не работает: (if (Serial.available() != 3)) или (if (Serial.available() == 3))

    Компилятор на неё не ругается, но условие просто не отрабатывается. Проверялось в отладке. А вот классическое условие проверки буфера на возможность считывания в таком виде (if (Serial.available() > 0)) работает всегда.

    Опытным путём выяснено, что проверку на количество байт можно сделать только через дополнительную переменную:

    Код:
    int n = Serial.available();
      if (n == 3) {
    
    //тут исполняем, если совпало
    
    }
    
    //тут если не совпало
    Может всё-таки есть возможность сделать изящно, как тут?: (if (Serial.available() == 3))
    МГТФ - любимый провод!
    KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL

  15. #10
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Проверялось в отладке
    Есть подозрение, что условие работает иногда, время от времени. Возможно потому, что там race condition - иногда в буфер успевает попасть нужное количество байт, а иногда просто нет.

    Через доп. переменную делать всегда лучше по нескольким причинам: можно в дебаге увидеть какое там значение, плюс читабельность лучше, что немаловажно.

    Я бы делал ожидание в спинлоке, примерно так:

    Код:
    bool success = false;
    for (int istep = 0; istep < 100; ++istep) // крутимся в цикле некоторое количество раз, это есть спинлок
    {
        int n = Serial.available();
        // здесь проверка что получили то что нужно, выставляем флажок успеха и выходим из цикла
        if (n == 3)
        {
            success = true;
            break;
        }
        // здесь можно делать дополнительный delay 
    }

Страница 1 из 5 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Вопросы начинающего ATM'щика
    от Максагор в разделе Разный софт
    Ответов: 43
    Последнее: 19.09.2023, 13:52
  2. Вопросы начинающего спектрумопаятеля :)
    от The_Medved в разделе Несортированное железо
    Ответов: 44
    Последнее: 08.10.2011, 22:59
  3. Монитор начинающего Спектрумиста
    от Doktor в разделе Для начинающих
    Ответов: 5
    Последнее: 14.04.2011, 11:02
  4. Ответов: 5
    Последнее: 25.08.2008, 01:13

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •