User Tag List

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 21 по 30 из 42

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

  1. #21
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Почему именно const int?
    Считается хорошим тоном в программировании на Си++ делать константным всё, что не должно меняться по ходу выполнения программы. В общем то это не обязательно, просто в силу привычки так написал. Можно вынести отдельным дефайном, если хочется.

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    bool ???
    Определяется переменная isSuccess логического типа - в ней будем хранить результат всей этой операции - успешный ли был прием или нет.

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Вот это вообще не понял. Тут цикл на 5? У нас же 3 байта
    Смысл в том, что эти 3 байта могут быть еще не доступны в момент опроса Serial.available(). Если мк на том конце тупит и отправляет с задержками, то Там может быть 1 байт или 2, а может быть и 3 - если повезет. Чтобы исключить фактор "везения-невезения" (то есть рандом) нужно сделать несколько попыток считать данные.
    Мы все равно не считаем больше заданного предельного количества байт - там есть проверка на это. То есть случилось чудо и при первой же попытке вычитали все три байта, то выходим из цикла (строка с if (numBytesReceived == NumBytesToReceive) ).

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    А почему char ?
    Считывается один байт. Char как раз имеет разрядность 8 бит, можно конечно сохранять и в int, но это не имеет смысла - на восьмибитных контроллерах int равен 2 байтам, это лишнее место на стеке.

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Можно словами описать алгоритм этого кода или более подробно в комментариях?
    Все просто. Читаем данные до тех пор пока не прочитаем все 3 байта, но чтобы не висеть вечность, ставим максимальное количество попыток, причем с небольшой задержкой, так чтобы в самом плохом сценарии, когда данные шлют медленно, все же их получить с большей вероятностью...

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

    SoftFelix(12.02.2020)

  2. #22
    Terabiterr
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    А почему char ?
    По ардуино есть документация хорошая ну к ней приступать нужно только после прочтения основ языка С что бы вы начали ее более менее понимать. Нужно изучить не большой ряд основ языка С и пройти не много практики на простых задачах. Инфы полно в гугл. Запросы Уроки по С, как программировать на С и т.п...
    А дальше на справочник ардуино.
    https://doc.arduino.ua/ru/prog/

  3. #23

    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    3,000
    Спасибо Благодарностей отдано 
    201
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SoftWareGuy, спасибо! Мне пока вот так нужно объяснять. И это я понимаю. Кстати, твой код нормально откомпилился в Ардуино IDE. Завтра на работе его попробую. А можно туда сразу добавить второй цикл синхронизации, как ПЦшном исходнике? В идеале на основе моего последнего кода.

    - - - Добавлено - - -

    Цитата Сообщение от SoftWareGuy Посмотреть сообщение
    Считывается один байт. Char как раз имеет разрядность 8 бит, можно конечно сохранять и в int, но это не имеет смысла - на восьмибитных контроллерах int равен 2 байтам, это лишнее место на стеке.
    Тогда тут можно и byte использовать?
    МГТФ - любимый провод!
    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

  4. #24
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    А можно туда сразу добавить второй цикл синхронизации, как ПЦшном исходнике? В идеале на основе моего последнего кода.
    Правильно ли я понял, что нужно
    1) отправить 512 пустых байт
    2) прочитать 3 байта
    3) повторно отправить 512 пустых байт
    4) еще раз считать 3 байта

    ?
    Если так, что можно выделить часть кода в отдельную функцию и вызывать ее дважды:

    Код:
    bool SYNC_1986_handshake()
    {
      while (Serial.available()) Serial.read(); 
    
      for (int i = 0; i < 512; i++) {
        Serial.write(0); 
      }
      Serial.flush(); 
    
      const int NumBytesToReceive = 3; // количество байт которые ждем в ответ
    
      int numBytesReceived = 0; // здесь храним количество принятых байт
      for(int istep = 0; istep < 5; ++istep) // делаем несколько попыток считать ответ
      {
    	while (Serial.available() && numBytesReceived < NumBytesToReceive) // читаем все что уже есть во входном буфере
     	{
     		char receivedByte = Serial.read(); // можно сохранить это где нибудь чтобы проверить значение
     		++numBytesReceived; // храним количество принятых байт
     	}
    
     	if (numBytesReceived == NumBytesToReceive) // получили все что нужно
     	{
     		return true; // возвращаем успех
     	}
    	delay(10);
      }
    
      return false; // возвращаем неудачу
    }
    
    void SYNC_1986() 
    {
      Serial.end();
      Serial.begin(9600); 
    
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Try to Sync...");
      lcd.setCursor(5, 1);
    
      bool isSuccess = SYNC_1986_handshake();
      if (isSuccess) // выполняем второй шаг только если предыдущий был успешен
      {
      	isSuccess = SYNC_1986_handshake(); 
      }
      
      if (isSuccess) {
        lcd.print("Succes!");
      } else {
        lcd.print("Failed!");
        delay(1000);
        menu = 3; //опять вернулись к файлу прошивки
        root = SD.open(name_folder + "/");
        SD_card(root);
        root.close();
      }
    }
    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Тогда тут можно и byte использовать?
    Вообще в Си нет такого типа. На ардуино это тайпдеф (то есть синоним) char.

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

    SoftFelix(12.02.2020)

  5. #25

    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    3,000
    Спасибо Благодарностей отдано 
    201
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftWareGuy Посмотреть сообщение
    Правильно ли я понял, что нужно
    1) отправить 512 пустых байт
    2) прочитать 3 байта и обработать ошибку
    3) повторно отправить 512 пустых байт, если предыдущий окончился ошибкой.
    4) еще раз считать 3 байта
    5) и тут обработать возможную ошибку.

    - - - Добавлено - - -

    Цитата Сообщение от SoftWareGuy Посмотреть сообщение
    Вообще в Си нет такого типа. На ардуино это тайпдеф (то есть синоним) char.
    А это что?
    МГТФ - любимый провод!
    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

  6. #26
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    А это что?
    Есть такая фича в Си языке - объявление синонимов для типов, typedef. Где-то в заголовочных файлах ардуино определен тайпдеф byte, который на самом деле unsigned char. Можно вот это почитать если интересно https://oscarliang.com/arduino-diffe...-unsigned-cha/

    - - - Добавлено - - -

    Забавно что в доках ардуины написано:

    For consistency of Arduino programming style, the byte data type is to be preferred

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

    SoftFelix(13.02.2020)

  7. #27

    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    3,000
    Спасибо Благодарностей отдано 
    201
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftWareGuy Посмотреть сообщение
    Если так, что можно выделить часть кода в отдельную функцию и вызывать ее дважды:
    К сожалению, это не работает - всегда пишет "Failed!". Компилятор ошибок не выдал.
    МГТФ - любимый провод!
    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

  8. #28
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    всегда пишет "Failed!"
    Нужно понять в какой момент случается fail - после первого вызова SYNC_1986_handshake или после второго. Можно временно убрать второй вызов SYNC_1986_handshake просто закомментировать строки

    Код:
      if (isSuccess)
      {
      	isSuccess = SYNC_1986_handshake(); 
      }
    и посмотреть что будет.

  9. #29

    Регистрация
    20.03.2007
    Адрес
    Санкт-Петербург
    Сообщений
    3,000
    Спасибо Благодарностей отдано 
    201
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SoftWareGuy Посмотреть сообщение
    Нужно понять в какой момент случается fail - после первого вызова SYNC_1986_handshake или после второго.
    Привет. Только вот дома...

    Я сейчас смотрю UART терминалкой, которая в BIN или в DEC может выводить. Так вот твой код выполняет только один (первый) хендшейк (видно что отправили 512 нулей), потом сразу Failed!, хотя должен был отправить второй хендшейк, т.к. первый закончился неудачей. Что-то с алгоритмом не то. Ведь этот код...

    Код:
    if (isSuccess)
      {
      	isSuccess = SYNC_1986_handshake(); 
      }
    ...читается как "если первый хендшейк был удачным, то делаем ещё один". Так? Только второй должен запускаться при неудаче в первом. Напомню, что работающий исходник ПЦшной программы находится в первой мессаге топика.

    Ещё я убрал условной компиляцией всю отладку, которая тоже шла в uart. Возможно, ещё из-за этого была проблема. Проверю только завтра на работе.

    p.s. Вот бы треминалку со скриптами, которая принимала определённую последовательность байт и выдавала бы сразу тоже что-то определённое. Т.е. эмулировать это контроллер.
    Последний раз редактировалось SoftFelix; 13.02.2020 в 22:28.
    МГТФ - любимый провод!
    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

  10. #30
    SoftWareGuy
    Гость

    По умолчанию

    Цитата Сообщение от SoftFelix Посмотреть сообщение
    Только второй должен запускаться при неудаче в первом
    Мой косяк, действительно невнимательно прочитал.
    Исправленный код:

    Код:
    bool SYNC_1986_handshake()
    {
      while (Serial.available()) Serial.read(); 
    
      for (int i = 0; i < 512; i++) {
        Serial.write(0); 
      }
      Serial.flush(); 
    
      const int NumBytesToReceive = 3; // количество байт которые ждем в ответ
    
      int numBytesReceived = 0; // здесь храним количество принятых байт
      for(int istep = 0; istep < 5; ++istep) // делаем несколько попыток считать ответ
      {
    	while (Serial.available() && numBytesReceived < NumBytesToReceive) // читаем все что уже есть во входном буфере
     	{
     		char receivedByte = Serial.read(); // можно сохранить это где нибудь чтобы проверить значение
     		++numBytesReceived; // храним количество принятых байт
     	}
    
     	if (numBytesReceived == NumBytesToReceive) // получили все что нужно
     	{
     		return true; // возвращаем успех
     	}
    	delay(10);
      }
    
      return false; // возвращаем неудачу
    }
    
    void SYNC_1986() 
    {
      Serial.end();
      Serial.begin(9600); 
    
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Try to Sync...");
      lcd.setCursor(5, 1);
    
      bool isSuccess = SYNC_1986_handshake();
      if (!isSuccess) // делаем еще одну попытку если в первый раз не получилось наладить связь
      {
      	isSuccess = SYNC_1986_handshake(); 
      }
      
      if (isSuccess) {
        lcd.print("Succes!");
      } else {
        lcd.print("Failed!");
        delay(1000);
        menu = 3; //опять вернулись к файлу прошивки
        root = SD.open(name_folder + "/");
        SD_card(root);
        root.close();
      }
    }

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

    SoftFelix(14.02.2020)

Страница 3 из 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

Ваши права

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