Хобрук: Ваш путь к мастерству в программировании

Увеличьте шестнадцатеричные значения последовательной записи ASIO

Я общаюсь с устройством через последовательный порт, используя Ubuntu. Все сообщения должны быть шестнадцатеричными значениями. Я протестировал настройку связи с помощью термита в среде Windows и получил ожидаемые ответы. Однако я не могу получить никаких ответов при использовании Boost: asio.

Вот как я настраиваю свой последовательный порт:

boost::asio::serial_port serialPort;
    serialPort.open(portNumber);
    serialPort.set_option(boost::asio::serial_port_base::baud_rate(baudRate));
    serialPort.set_option(boost::asio::serial_port_base::character_size(8));
    serialPort.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
    serialPort.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
    serialPort.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none));

  uint8_t hexValue = message.at(i) >= 'A' ? (message.at(i) - 'A' + 10) : message.at(i) - '0';
  serialPort.write_some(boost::asio::buffer(&hexValue, sizeof(uint8_t)));

Итак, мне нужно что-то настроить в ASIO, чтобы он отправлял правильно?


  • Что вы подразумеваете под шестнадцатеричными значениями? Вы уверены, что строка uint8_t hexValue = ...; верна? 14.04.2016
  • @MikeCAT Я хотел передать шестнадцатеричные значения, такие как {0,1,...E,F}, в виде двоичных данных. Так что да, похоже, мое преобразование было неправильным. Однако человек ниже, который предоставил рабочее преобразование и способ записать его в последовательный порт. 14.04.2016
  • Байт (8 бит) состоит из двух шестнадцатеричных цифр, а не из одной. Уверены ли вы? 15.04.2016

Ответы:


1

Похоже, вы действительно хотите отправить двоичные данные, соответствующие шестнадцатеричному тексту, который у вас имеется в message.

Есть много способов снять шкуру с этой кошки. Лично я бы начал с расшифровки всего сообщения. Это всегда будет уменьшать размер сообщения в шестнадцатеричном формате. Так что вы можете сделать это на месте, если хотите.

Простой пример из старого ответа:

std::string hex2bin(std::string const& s) {
    assert(s.length() % 2 == 0);

    std::string sOut;
    sOut.reserve(s.length()/2);

    std::string extract;
    for (std::string::const_iterator pos = s.begin(); pos<s.end(); pos += 2)
    {
        extract.assign(pos, pos+2);
        sOut.push_back(std::stoi(extract, nullptr, 16));
    }
    return sOut;
}

Теперь вы просто отправляете возвращенную строку на последовательный порт:

std::string binary_msg = hex2bin(message);
serialPort.write_some(boost::asio::buffer(binary_msg));

Также просмотрите глобальный http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/write.html, чтобы написать все сообщение за одну составную операцию.

14.04.2016
  • можете ли вы объяснить, что именно делает эта функция, пожалуйста? 15.04.2016

  • 2

    вы, кажется, забыли io_service для экземпляра serial_port. Конструктор по умолчанию serial_port имеет 2 параметра io_service и имя порта.

    26.05.2016
    Новые материалы

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...