Задать вопрос
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    Danilka2400, После read явно не хватает проверок полученных данных на корректность по требованиям протокола. Вдруг вам там пургу гонят или например вы прочитали пакет не до конца и т.п. Прочитать только часть пакета из последовательного порта (да и не только) можно легко, это вообще обычное поведение всех коммуникационных вызовов.

    Запустите под отладчиком да посмотрите по шагам где тут косяк.
    Или просто выводите в лог (на экран или куда можете) промежуточные значения.
    При входных данных "95" в asciiHex должно содержаться {'9', '5', 0}

    В целом ваш код выглядит правильно, но много лишних телодвижений на мой взгляд. Возможно вам это для чего-то надо, не знаю.
    Правда осталось не ясно как определен kolchislo. И вы продолжаете использовать VLA в buffff. VLA - это зло. Подумайте как уйти от этого.
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    Danilka2400, Какого массива? На каком этапе? Вы постоянно не договариваете и не приводите ваш код в котором ошибка. На эти вопросы нельзя ответить.
    Код можно приводить тут или публиковать где-нибудь на https://gcc.godbolt.org/ или на том же github.
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    Danilka2400, 31 и 39 - это шестнадцатиричный код символов '1' и '9'
    https://www.asciitable.com/

    После преобразования строки "\x31\x39" в число вы получите decValue==25==0x19
    В decValue вообще хранится число в двоичном виде (не в десятичном и не в шестнадцатиричном).
    Как сделать так, чтобы он не 25, а сразу 19 писал?

    Serial.printf("%X\n", decValue);
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    byte kolchislo[]={0x00,0x00,0x00,0x00,0x00};
    razmer=1;// может и 2 и 3 быть, от этого завесить дальнейший размер
    char asciiHex[sizeof(kolchislo) + 1];
    for(int i = 0;i<razmer;i++){
                asciiHex[i]=kolchislo[i];
              }
    asciiHex[razmer] = 0;
    int decValue = strtol(asciiHex, NULL, 16);
    decValue++;
    Serial.printf("%X\n", decValue);
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    Danilka2400,
    1. char asciiHex[razmer];
    Это массив переменной длинны (VLA). Не советую его использовать вообще никогда.
    Лучше сделайте, например так:
    char asciiHex[sizeof(kolchislo)];
    2. Как я писал в ответе strtol ждет от вас в параметре строку (null terminated string). У вас даже и не пахнет в asciiHex null terminated - это выход за пределы выделенной памяти и UB. Чтоб asciiHex сделать null terminated надо:
    - сделать asciiHex на 1 байт больше
    - записать после всех данных 0: asciiHex[razmer] = 0;
    3. Обратное преобразование вы делаете 2 раза: в sprintf и в Serial.printf. На выходе явно получите не правильный результат. Достаточно такого варианта: Serial.printf("%X\n", decValue);
    Без цикла и без промежуточного массива.
  • Как конвертировать из DEC в HEX ASCII?

    @res2001
    Danilka2400, Кто кого превратил? Не понятно. Давайте пример кода.
  • Почему GCC не видит встроенную атомарную операцию?

    @res2001
    Не хочу возиться со всякими dummy узлами

    Имеете ввиду алгоритм очереди Майкла&Скотта?
    Там не для красоты используется фиктивный узел в очереди.
    Без фиктивного узла вам нужно будет атомарно изменять 2 указателя (node->next и home/end). Правда, у вас пока еще указателя end нет, но он появится вскоре, я думаю.

    Еще немного, раз уж вы не используете функции из стандартной библиотеки, тогда не мешало бы определять все указатели, участвующие в атомарных операциях как volatile. И про выравнивание атомарных переменных то же не забывайте.
  • Почему GCC не видит встроенную атомарную операцию?

    @res2001
    Сергей Соловьев,
    Во-вторых, я использую C

    Я дал ссылку на Сишный вариант.
    В отношении атомиков стандартный функционал С++ и С идентичен, начиная с версии 11 обоих ЯП
    В С++ правда еще можно в классы, но это можно рассматривать как надстройку над атомарными функциями.
  • Как оптимизировать код с++ с рекурсией в времени?

    @res2001
    Используйте std::div для вычисления остатка и частного одновременно.
  • Как подключить библиотеку TgBot к срр проекту?

    @res2001
    Тимофей, Т.к. вы используете vcpkg, то оптимально было бы добавить путь в PATH к каталогу vcpkg/.../bin. Тогда у вас автоматически все библиотеки предоставляемые vcpkg станут доступны.
    Так же не забудьте, что при переносе приложения на другой комп (или изготовлении инсталятора) надо будет тащить с собой и dll (lib не нужен). Тут так же надо будет решать куда положить dll: можно рядом с exe, можно в c:\windows\system32
  • Как составить план по изучению языка C++?

    @res2001
    во всех книгах план примерно такой

    Это не план, это оглавление
    тип string является вовсе не типом, а классом

    Классы - это и есть типы. Только это не встроенные типы, а типы определяемые пользователем. В случае с std::string - это тип определяемый стандартной библиотекой, но это не принципиально.
    Кроме классов есть еще структуры, это по сути одно и то же, кроме небольших различий.
    ввод/вывод в консольном приложении осуществляется через объекты cin и cout

    И что? У вас с этим проблемы? Можете использовать и std::printf, но это не "С++ style" :)

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

    @res2001
    Тимофей, Переложить dll либо в папку с вашим exe файом, либо в каталог, который указан в PATH, либо добавить в PATH собственный путь. Т.е. просто сделать так, чтоб винда по своему алгоритму поиска dll смогла найти нужный вам файл.
  • Как подключить библиотеку TgBot к срр проекту?

    @res2001
    Тимофей, На скринах инструкция правильная.
    Я бы не использовал вариант с pragma, а подключал библиотеку "альтернативным" способом. Хотя этот способ собственно основной, а никак не альтернативный. А pragma - как раз альтернативный и поддерживается далеко не всеми компиляторами.
    Проверьте, чтоб lib и dll файлы находились в каталогах, указанных в п.1, а заголовочные файлы библиотеки находились в каталоге Additional Include Directories.
  • Ошибка в bat скрипте который изменяет протокол ip версии 4 (tcp/IPv4), как исправить?

    @res2001
    Роман Страх,
    не нравится ему маска все равно + ip пустой

    Предполагаю, что ему больше не нравится пустой IP, а маска как следствие.
    Почему IP пустой? Вы же писали выше, что IP выделить получается. После цикла поиска IP напечатайте содержимое ip_address.
    Кстати, после цикла уже можно использовать стандартный вариант обращения к переменной: echo.%ip_address%
  • Ошибка в bat скрипте который изменяет протокол ip версии 4 (tcp/IPv4), как исправить?

    @res2001
    Роман Страх,
    по отдельности получается найти ip , грамотно через tokens выделить только его но все вместе работать не хочет.

    По крайней мере у меня ваш цикл отрабатывает, правда у меня английская винда, пришлось немного подправить строку поиска. Одно но - ip_address будет установлен в последний адрес в списке, если интерфейсов несколько.

    Возможно стоит указать полный вариант команды:
    netsh interface ip set address name="%interface_name%" source=static address=!ip_address! mask=%subnet_mask% gateway=%gateway%

    Можете так же выдернуть команду из батника и выполнить ее в ком.строке целиком, без консоли netsh.
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    для обработки ERROR_IO_PENDING как раз и применяется WaitForSingleObject

    В случае чтения вызов WaitForSingleObject только после WaitCommEvent.
    Я же пишу о том, что ReadFile может вернуть ERROR_IO_PENDING, даже в вашем случае.

    Таймауты сейчас скорее всего роли не играют. Но в таком случае их лучше не использовать.

    Зачем использовать EV_ERR когда мы передаем и получаем одинаковое кол-во байт? Куда переполнится буфер если мы всего для теста запускаем 1 отправку и 1 чтение, а запас в 1,5х объема?

    Имею ввиду промежуточный буфер ядра, а не ваши буфера, которые вы передаете в ReadFile.
    Если вы не успеваете почему то вычитывать данные при их большом количестве, то буфер ядра может переполнится и будут пропуски данных.
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    "ожидание блока байтов с прочтением их всех"

    Вот с прочтением "их всех" у вас и проблема.
    Хотя бы обработайте возвращаемое значение ReadFile и возможный даже в этом случае ERROR_IO_PENDING.
    Хрен с ней с асинхронщиной, можете оставить как есть, но использование ReadFile надо поправить.
    В текущем виде ReadFile - это потенциальное место где возможны ваши проблемы.

    Таймауты странные. Почему 10 везде? Я бы высчитывал значение таймаута чтения для каждой операции чтения исходя из размера буфера и заполнял им только ReadTotalTimeoutConstant. Остальное в 0.

    Так же не плохо бы добавить обработку SetCommMask(EV_ERR) - помимо ошибок обмена, можно будет отлавливать переполнение буфера. Вы же теряете байты.
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    это обеспечивает асинхронные EV_RXCHAR и EV_TXCHAR

    У вас и работа с EV_RXCHAR по сути синхронная - установили флаг - дождались события. Можно просто использовать синхронную WaitCommEvent с тем же эффектом.
    Про EV_TXCHAR в примере кода вообще нет упоминания.

    Возможно вам для чего-то еще нужен асинхронный режим. Но из приведенных фрагментов кода это никак не следует.

    Я не просто так указал verilog здесь, потому что я не уверен 100% что здесь нет ее вины.

    Тем более нет смысла усложнять. Делайте максимально просто, чтоб сократить возможное количество ошибок на этой стороне.
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов, На счет 1 байта - чтоб операция ReadFile не завершалась на чтении каждого байта можно предварительно установить таймауты:
    https://learn.microsoft.com/en-us/windows/win32/ap...
    https://learn.microsoft.com/en-us/windows/win32/ap...

    Наличие таймаута не гарантирует, что прочитается заданное количество байт за это время.